iOS将NSLog的内容输出到界面上

有时候,我们断开手机的数据线以后,里面的NSLog输出就不再显示了。所以有时候我们需要将输出显示到界面上。

思路

首先,我们要显示到界面上,肯定得有个文字的载体,这里就用UITextField来做输出信息的载体。

@interface ZYConsoleTextField:UITextView

@end

@implementation ZYConsoleTextField

- (instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {


    }

    return self;

}

@end

- (ZYConsoleTextField *)textField{

    if (!_textField) {

        _textField = [[ZYConsoleTextField alloc]initWithFrame:CGRectMake(ScreenWidth*0.2, ScreenHeight*0.2, ScreenWidth*0.6,ScreenHeight*0.6)];

        _textField.backgroundColor = [UIColor blackColor];

        _textField.text = @"\n\n";

        _textField.editable = NO;

        self.textField.textColor = [UIColor whiteColor];

        self.textField.selectable = NO;

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

                [[UIApplication sharedApplication].keyWindow addSubview:_textField];

        });

    }

    return _textField;

}

然后,我们也得像NSLog()那样有个也让用户能输入日志的地方,这里我就用ZYLog()来代替了。代码如下:

//最上层封装方法

#define ZYLog(parm, ...)  LOG_OBJC_MAYBE(parm, ##__VA_ARGS__)

//将当前函数传进去

#define LOG_OBJC_MAYBE(parm, ...)  LOG_MAYBE(__PRETTY_FUNCTION__, parm, ##__VA_ARGS__)

//传到最底层来调用OC方法

#define LOG_MAYBE(function, parm, ...)  do { if(1 & 1) LOG_MACRO(function, parm, ##__VA_ARGS__); } while(0)

//调用OC函数

#define LOG_MACRO(function, parm, ...)  [[ZYConsole sharedConsole] func: function line:__LINE__ format: (parm), ##__VA_ARGS__]

挨个讲解一下,#define是宏定义的意思,LOG_OBJC_MAYBE(parm, ##__VA_ARGS__)为ZYLog()的方法体。##__VA_ARGS__代表多个不定参数的意思,比如[NSString stringWithFormat:@"%@,%@",string1,string2],这里的string1,string2就代表##__VA_ARGS__。再就是__PRETTY_FUNCTION_,代表的意思代码当前所在的函数,也就是这个日志在哪里产生的。__LINE__代表当前代码所在的行数。

- (void)func:(const char *)function

            line:(NSUInteger)line

          format:(NSString *)format, ... NS_FORMAT_FUNCTION(3,4){

    va_list args;

    if (format) {

        va_start(args, format);

        NSString *message = nil;

        message = [[NSString alloc] initWithFormat:format arguments:args];

        //UI上去展示日志内容

        [self printMSG:message andFunc:function andLine:line];

    }

}

- (void)printMSG:(NSString *)msg andFunc:(const char *)function andLine:(NSInteger )Line{

    //方法名C转OC

    NSString *funcString = [NSString stringWithUTF8String:function];

    ///时间格式化

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSS";

    msg = [NSString stringWithFormat:@"%@ %@ line-%ld  %@\n\n",[formatter stringFromDate:[NSDate new]],funcString,(long)Line,msg];

    const char *resultCString = NULL;

    if ([msg canBeConvertedToEncoding:NSUTF8StringEncoding]) {

        resultCString = [msg cStringUsingEncoding:NSUTF8StringEncoding];

    }

    //控制台打印

    printf("%s", resultCString);

        [_logSting appendString:[NSString stringWithFormat:@"%s",resultCString]];

          self.textField.text = _logSting;

}

va_list代表当前参数列表,是个C语言函数,va_start是将args参数与format参数进行绑定关联。就这样,一个最基本的输出完成了。

你可能感兴趣的:(iOS将NSLog的内容输出到界面上)