获取自定义类的超级视图

时间:2015-06-24 22:52:10

标签: ios objective-c uitableview uiviewcontroller superview

我有一个自定义类myCustomClass,它是UITextField的子类。 (我打算在myCustomClass课程中致电viewControllers。)

myCustomClass中,我正在尝试检查调用它的类的viewController类型。 (UIViewControllerUITableViewController等。)

我试过了:

if ([self.superview.nextResponder isKindOfClass[UIViewController class]]) {
    NSLog(@"View Controller");
} else if ([self.superview.nextResponder isKindOfClass[UITableViewController class]) {
    NSLog(@"TableView Controller");
}

如果superclassviewController,我只会得到一个结果。所以我做了以下事情:

NSLog(@"%@", self.superview.nextResponder);

结果

UIViewController类 - ViewController

UITableViewController类 - UITableViewCell

如何检查它是否是UITableViewController?

1 个答案:

答案 0 :(得分:0)

对于您的特定情况,您可以使用[self.superView isMemberOfClass:[UITableViewCell class]]检查您的自定义视图是否在表视图单元格内(除非您以不寻常的方式使用tableViewCell!)表示它是从UITableViewController调用的。

更一般地说,如果你想找到包含视图控制器,你可以递归地向上走响应者链,找到包含viewController的内容,如本帖子的第二个答案: Get to UIViewController from UIView?

同样重要的是要注意isKindOfClass:isMemberOfClass:

之间存在差异
    如果'接收者是给定类的实例或从该类继承的任何类的实例,则
  • isKindOfClass返回YES。

  • 如果'接收者是给定类的实例,则
  • isMemberOfClass返回YES。

因此,从UIViewController继承的UITableViewController将对isKindOfClass:[UIViewController class]回答“是”,您的if语句是否会意外执行。 (虽然在示例中它也无法正常工作,因为您仍然需要进一步向上走动响应链。)

因此,如果您实际上正在将UIViewController与UITableViewController进行比较,请使用-isMemberOfClass,并且示例中的逻辑将按预期工作。