美文网首页iOS Developer
iOS-当前控制器名字

iOS-当前控制器名字

作者: linbj | 来源:发表于2017-05-27 15:45 被阅读298次
界面上一直显示当前控制器的名字

demo

IMG_0967.PNG
思路:

ICEDebuger类
用于显示当前控制器的一个单例,一个label。

UIViewController+ICEDebuger类
在+ (void)load;方法中利用runtime的method_exchangeImplementations(Method m1, Method m2)方法在viewDidAppear中获取当前界面的类名。

ICEDebuger.h

//
//  ICEDebuger.h
//  ICEDebuger
//
//  Created by iOS on 27/5/17.
//  Copyright © 2017年 iOS. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ICEDebuger : NSObject
+ (instancetype)shareInstance;


/// 自定义要显示的信息
@property (nonatomic, copy)NSString * strTitle;

/// 显示信息标签
@property (nonatomic, strong, readonly)UILabel * lblNote;

@end

ICEDebuger.m

//
//  ICEDebuger.m
//  ICEDebuger
//
//  Created by iOS on 27/5/17.
//  Copyright © 2017年 iOS. All rights reserved.
//

#import "ICEDebuger.h"

@interface ICEDebuger ()
@property (nonatomic, strong) UILabel *lblNote;
@end

@implementation ICEDebuger
+ (instancetype)shareInstance {
    static ICEDebuger *debuger = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        debuger = ICEDebuger.new;
    });
    return debuger;
}

- (instancetype)init {
    self = [super init];
    if (self) {
        self.strTitle = @"控制器:";
    }
    return self;
}

- (UILabel *)lblNote {
    if (!_lblNote) {
        _lblNote                           = UILabel.new;
        _lblNote.frame                     = CGRectMake(0, 16, UIScreen.mainScreen.bounds.size.width, 20);
        _lblNote.textColor                 = [UIColor whiteColor];
        _lblNote.adjustsFontSizeToFitWidth = YES;
        _lblNote.font                      = [UIFont systemFontOfSize:14];
        _lblNote.backgroundColor           = [UIColor blackColor];
    }
    if (!_lblNote.superview) {
        UIWindow * window = [[[UIApplication sharedApplication] delegate] window];
        if (window) {
            [window addSubview:_lblNote];
        }
    }
    return _lblNote;
}
@end

//
//  UIViewController+ICEDebuger.m
//  ICEDebuger
//
//  Created by iOS on 27/5/17.
//  Copyright © 2017年 iOS. All rights reserved.
//

#import "UIViewController+ICEDebuger.h"
#import <objc/runtime.h>
#import "ICEDebuger.h"

@implementation UIViewController (ICEDebuger)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method iceViewDidAppear = class_getInstanceMethod(self, @selector(iceViewDidAppear:));
        Method viewDidAppear    = class_getInstanceMethod(self, @selector(viewDidAppear:));
        method_exchangeImplementations(viewDidAppear, iceViewDidAppear);
        
        Method iceDealloc = class_getInstanceMethod(self, @selector(iceDealloc));
        Method dealloc    = class_getInstanceMethod(self, NSSelectorFromString(@"dealloc"));
        method_exchangeImplementations(dealloc, iceDealloc);
    });

}

- (void)iceViewDidAppear:(BOOL)animated {
    if(![self isPrivateVC]) {
        UILabel *label = (UILabel *)[ICEDebuger shareInstance].lblNote;
        if (label.superview) {
            [label.superview bringSubviewToFront:label];
        }
        if ([ICEDebuger shareInstance].strTitle == nil) {
            [ICEDebuger shareInstance].strTitle = @" ";
        }
        label.text = [NSString stringWithFormat:@"%@%@",[ICEDebuger shareInstance].strTitle,[NSStringFromClass(self.class) componentsSeparatedByString:@"."].lastObject];
    }
    [self iceViewDidAppear:animated];
}

- (void)iceDealloc {
    NSLog(@">>>>>>>>>>%@ 已经释放了<<<<<<<<<<",[NSStringFromClass(self.class) componentsSeparatedByString:@"."].lastObject);
    [self iceDealloc];
}

- (BOOL)isPrivateVC {
    NSString * selfClass = NSStringFromClass(self.class);
    return [selfClass isEqualToString:@"UIAlertController"] ||
    [selfClass isEqualToString:@"_UIAlertControllerTextFieldViewController"] ||
    [selfClass isEqualToString:@"UIApplicationRotationFollowingController"] ||
    [selfClass isEqualToString:@"UIInputWindowController"];
}

@end

相关文章

网友评论

    本文标题:iOS-当前控制器名字

    本文链接:https://www.haomeiwen.com/subject/kwsqfxtx.html