0

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

我试图清理构建并重建,但它仍然给出了这个错误。我该如何解决这个问题?

谢谢,布鲁斯

4

3 回答 3

1

任何消息都可以发送到Objective-C 中的任何对象,只要该方法在当前范围内的某处声明(即,它在某个类中的某个导入的头文件中声明)。

你说的可能有两个问题:

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

  2. 由于self.splitViewController是 type UISplitViewController *,并且logoutUser:不是 的方法UISplitViewController,因此您可能会收到警告(不是错误),它可能不会响应该方法。这是静态类型检查的结果,因为UISplitViewController *它是一个具体类型。您可以通过以下任一方式解决此问题

    1. 正如恩里克的回答所暗示的那样,将其转换为支持该方法的类型;或者
    2. 将其转换为类型id,使其不进行静态类型检查,例如

    [(id)self.splitViewController logoutUser:self];

于 2012-05-04T20:10:45.010 回答
1

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

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

于 2012-04-11T15:49:24.357 回答
-1

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

 [self.splitViewController performSelector:@selector(logoutUser:) withObject:self];
于 2012-04-20T16:43:49.023 回答