我有一个自定义的UISplitViewController,因此我可以向用户显示一个登录屏幕。在这个控制器中我也有一个注销方法。
注销按钮位于MasterViewController的导航栏中。当用户单击注销时,我试图调用UISplitViewControllers logoutUser方法。首先我试过了:
[self.splitViewController logoutUser:self];
这在尝试编译时出错:
'UISplitViewController'没有可见的@interface声明选择器'logoutUser:' 然后我注释掉了有问题的行并添加了以下if,检查我的UISplitViewController是否确实响应了选择器。
if([self.splitViewController respondsToSelector:@selector(logoutUser:)]){
// [self.splitViewController logoutUser:self];
NSLog(@"Selector");
}else{
NSLog(@"No Selector");
}
在运行时的日志中我得到了Selector。取消注释[self.splitViewController logoutUser:self]我得到了同样的错误。
我尝试清理构建并重建但它仍然会出现此错误。我如何解决这个问题?
谢谢, 布鲁斯
答案 0 :(得分:1)
似乎self.splitViewController是基本的splitViewController,编译器无法找到logoutUser方法。但是,在运行时,splitViewController可以响应该方法。 正如您所说,您的splitViewController是自定义的,请尝试转换为自定义控制器:
[(yourCustomViewController *)self.splitViewController logoutUser:self];
答案 1 :(得分:1)
任何消息都可以发送到Objective-C中的任何对象,只要该方法在当前作用域中的某个地方声明(即它在某个导入的标题中的某个类中声明)。
您可能会遇到两个问题:
您没有导入包含该方法的标头。 (它声明的类甚至不必与你现在调用它的类相同;它只需要声明某处。)在这种情况下,你将得到一个警告未找到该方法,并假设该方法返回类型id
。您可以通过导入自定义视图控制器的标题来解决此问题。
由于self.splitViewController
类型为UISplitViewController *
,而logoutUser:
不是UISplitViewController
的方法,因此您可能会收到警告(它不会响应该方法。这是静态类型检查的结果,因为UISplitViewController *
是具体类型。您可以通过
id
类型,因此不会进行静态类型检查,例如 [(id)self.splitViewController logoutUser:self];
答案 2 :(得分:-1)
如上所述,我找到了答案:
[self.splitViewController performSelector:@selector(logoutUser:) withObject:self];