有时候,我们断开手机的数据线以后,里面的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参数进行绑定关联。就这样,一个最基本的输出完成了。