我正在尝试在用户接受位置共享后显示视图。这是代码:
-(void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (status == kCLAuthorizationStatusDenied) {
NSLog(@"Denied");
}
else if (status == kCLAuthorizationStatusAuthorized) {
NSLog(@"Accepted!");
AlertViewController *aViewController = [[AlertViewController alloc] initWithNibName:@"AlertViewController" bundle:nil];
aViewController.view.frame = CGRectMake(0, 0, 320, 460);
aViewController.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.window addSubview:[aViewController view]];
}
}
但我在第*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xee6fc90'
行
aViewController.view.frame = ...
错误
我在aViewController
声明之后放置断点并验证0x00000
不是alloc
。我似乎无法弄清问题是什么。请提出解决方案。
答案 0 :(得分:3)
我怀疑xib文件或AlertViewController的视图初始化例程(即viewDidLoad或loadView)存在问题。我可以推断设置框架的线路崩溃的唯一方法是,它是第一次访问视图属性,并且视图被延迟加载。
我怀疑如果你换了
aViewController.view.frame = CGRectMake(0, 0, 320, 460);
带
UIView *aVCView = aViewController.view;
aVCView.frame = CGRectMake(0, 0, 320, 460);
然后你会在第一行看到崩溃,而不是第二行。
为了进一步调试,我会使用AlertViewController的viewDidLoad或类似的中断。并仔细检查xib中的所有内容。
答案 1 :(得分:2)
您看到的错误意味着您或框架正在尝试获取NSNumber
的长度。它们没有长度
要缩小范围,您应该使用异常断点:
运行,这次调试器将在抛出异常时中断,而不是等待它被展开并且应用程序被终止。你会得到一个更多更好地了解实际发生的事情。
一些可能性:
NSNumber
属性分配NSString
,例如textview的text
。似乎调整视图上的框架是触发它的原因,但是bug存在于其他代码中。NSNumber
,但其他代码试图访问该生命周期后该位置的字符串。NSNumber
视为一个字符串。但这种猜测相当无用。在发生异常的地方停止调试器;问题可能会变得很明显。
答案 2 :(得分:0)
在条件语句中,status
是什么类型的?您可能使用了错误的运算符或方法。例如,如果status
是int
,bool
或float
,则可以使用==
。如果是字符串,则使用isEqualToString
,如果是通用对象,则只能使用isEqual:
。还有isEqual:
函数的专用版本,例如isEqualToArray
。
希望这有帮助!