如何处理动态代码块中的Objective-C错误?

时间:2011-04-04 04:05:42

标签: objective-c xcode

我确定这个问题的答案基本上是令人尴尬的,但是我很难理解XCode中的实时编译/错误检查应该如何与动态性质一起工作Objective-C。

例如,我想对于topViewController在我的视图控制器堆栈中的tableView的setEditing:YES。所以我试试这个:

[self.navigationController.topViewController.tableView setEditing: YES animated: YES];

XCode抱怨:Property 'tableView' not found on object of type 'UIViewController'

现在,这段代码在UIViewController中,但只有在topViewController是UITableViewController时才会被调用,但显然Xcode不知道。

我该如何解决这个问题?这是否表明我的编码习惯不好?我尝试在条件中包装该行以测试topViewController.tableView!= nil,但Xcode然后只是关于条件行:)

编辑:感谢下面的saadnib和Caleb的回答,这就是我现在所拥有的:

if ([self.navigationController.topViewController isKindOfClass:([UITableViewController class])] ) {
    UITableViewController *topController = (UITableViewController *)self.navigationController.topViewController;
    [topController.tableView setEditing: YES animated: YES];
}

2 个答案:

答案 0 :(得分:4)

实际上,您可以通过对其进行类型转换来访问topViewController的属性。例如,你的topViewController名称是“FirstViewController”,那么你可以这样做

FirstViewController *fvc = (FirstViewController*)self.navigationController.topViewController;

[fvc.tableView setEditing: YES animated: YES];

我希望这会对你有所帮助。

答案 1 :(得分:1)

您收到错误,因为self.navigationController.topViewController返回类型为UIViewController*的指针,而UIViewController没有tableView属性。 @ saadnib的答案是正确的:如果你知道指针总是指向某个UIViewController子类,你可以将它强制转换为该类型。

但是,即使您“知道”顶视图控制器将始终是表视图控制器,您可能希望在运行时检查是否是这种情况。您可以使用-isKindOfClass:来查看控制器是否是UITableViewController的子类。当然,你仍然需要演员,但它会更安全一些。