从MasterViewController无法识别UISplitViewController选择器

时间:2012-04-11 15:28:48

标签: iphone uisplitviewcontroller

我有一个自定义的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]我得到了同样的错误。

我尝试清理构建并重建但它仍然会出现此错误。我如何解决这个问题?

谢谢, 布鲁斯

3 个答案:

答案 0 :(得分:1)

似乎self.splitViewController是基本的splitViewController,编译器无法找到logoutUser方法。但是,在运行时,sp​​litViewController可以响应该方法。 正如您所说,您的splitViewController是自定义的,请尝试转换为自定义控制器:

[(yourCustomViewController *)self.splitViewController logoutUser:self];

答案 1 :(得分:1)

任何消息都可以发送到Objective-C中的任何对象,只要该方法在当前作用域中的某个地方声明(即它在某个导入的标题中的某个类中声明)。

您可能会遇到两个问题:

  1. 您没有导入包含该方法的标头。 (它声明的类甚至不必与你现在调用它的类相同;它只需要声明某处。)在这种情况下,你将得到一个警告未找到该方法,并假设该方法返回类型id。您可以通过导入自定义视图控制器的标题来解决此问题。

  2. 由于self.splitViewController类型为UISplitViewController *,而logoutUser:不是UISplitViewController的方法,因此您可能会收到警告(它不会响应该方法。这是静态类型检查的结果,因为UISplitViewController *是具体类型。您可以通过

    解决此问题
    1. 将其转换为支持该方法的类型,正如Enrique的回答所暗示的那样;或
    2. 将其强制转换为id类型,因此不会进行静态类型检查,例如
    3. [(id)self.splitViewController logoutUser:self];

答案 2 :(得分:-1)

如上所述,我找到了答案:

 [self.splitViewController performSelector:@selector(logoutUser:) withObject:self];