我有一个自定义表视图控制器pfTableViewController
和一个自定义单元格customTableViewCell
。
从我的customTableViewCell
内部,我试图访问pfTableViewController
的NSMutableArray
:
- (IBAction)changeEditing:(UITextField *)sender {
pfTableViewController *pfWin = (pfTableViewController *) self.superview.superview;
[pfWin.pfFields replaceObjectAtIndex: myId withObject: @"some text"];
}
我使用了两次superview,因为第一个调用UITableView
,第二个应该调用pfTableViewController
,但它没有发生,我得到这个错误:
2013-04-17 09:48:38.017 webgopher[21757:907]-[UIViewControllerWrapperView pfffields]: unrecognized selector sent to instance 0x1d590d90
你知道这是怎么回事吗?
如果我使用更多的父视图,它访问UINavigationTransitionView
,我认为这太远了!
在苹果实现的视图(如UITableViewCell
)上使用superview.superview
是一个非常糟糕的主意。你依赖于视图层次结构不变。这种东西在不同的iOS版本之间很容易被破坏。
你也假设表视图的父视图是你的视图控制器的一个实例。但是视图控制器实例不是视图也不是视图层次结构的一部分。相反,你得到的是一个私有的apple视图,它包装了视图控制器的视图。
你应该在你的cell上实现某种委托方法它是由视图控制器实现的。这样,视图控制器就可以直接收到"changeEditing"事件的通知,而不必爬上私有视图层次。
你不能直接从控制器的视图访问它。您需要通过响应器链查找第一个控制器。这篇文章可能有用。-
如何在iPhone SDK中获得UIView's superView的UIViewController ?