获取自定义的 superView class

Get superView of custom class

我有一个自定义 class myCustomClass,它是 UITextField 的子class。 (我将在 viewControllers class 中调用 myCustomClass。)

myCustomClass 中,我试图检查调用它的 viewController 和 class 是哪种类型。 (UIViewController, UITableViewController 等)

我试过了:

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 Class - ViewController

UITableViewController Class - UITableViewCell

如何检查它是否是 UITableViewController?

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

更一般地说,如果您想找出包含视图控制器,您可以递归地沿着响应链向上查找包含 viewController,如本 post 中的第二个答案所示: Get to UIViewController from UIView?

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

之间的区别
  • isKindOfClass returns 如果 'the receiver is an instance of given class or an instance of any class that inherits from that class.'

  • isMemberOfClass returns YES 如果'接收方是给定 class.'

  • 的实例

因此,您的继承自 UIViewController 的 UITableViewController 将对 isKindOfClass:[UIViewController class] 回答 YES,您的 if 语句是否会发生意外行为。 (尽管在示例中它也没有正常工作,因为您仍然需要进一步沿着响应链向上走)。

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