我有一个UIViewController
名为“MainView”,其中一个UITableView
名为“tblLists”
tblLists
生成customCell
- “customCellList”。
我的问题是我可以在MainView
课程中获得customCellList
的实例(自我)。
我尝试使用superview的东西,但没有得到MainView
。我想在没有协议的情况下实现这一点。
所以需要你的帮助。
答案 0 :(得分:7)
您可以使用响应程序链来访问视图控制器。假设您的customCell类是UITableViewCell子类,以下方法应该完成这项工作:
@implementation customCell
- (UIViewController *)getViewController
{
id vc = [self nextResponder];
while(![vc isKindOfClass:[UIViewController class]] && vc!=nil)
{
vc = [vc nextResponder];
}
return vc;
}
@end
上述代码由Sensible TableView框架提供。
答案 1 :(得分:2)
你问的不是一个好主意,你应该找到另一种方法。它打破了MCV模式。
顺便说一句,如果您担心使用ARC并且以iOS> = 5为目标的内存问题,您可以创建对表视图本身的弱引用,并将视图控制器作为其委托或数据源属性(当然,如果VC是一个)他们)。或者您可以创建对VC本身的弱引用。
正如评论所指出的那样,不是一个好主意,更好地找到另一种方式。如果你需要更新单元格值,有很多方法可以重新加载tableview数据!通过在模型上对VC使用KVO,通知,委托等,您可以简单地触发重新加载到表视图而不涉及单元格中的奇怪引用。
希望这会有所帮助。
答案 2 :(得分:1)
对于那些想要破坏MVC的极少数情况。这假设您在窗口上使用导航控制器作为rootVC。更新了Swift 2
func visibleVC() -> UIViewController? {
if let navVC: UINavigationController = UIApplication.sharedApplication().keyWindow?.rootViewController as? UINavigationController {
if let vc: UIViewController = navVC.visibleViewController as? MyViewControllerClass {
return vc
}
}
return nil
}
答案 3 :(得分:0)
您还可以访问rootViewController:
UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;
答案 4 :(得分:0)
我有类似的问题,我的情况是当Table View自定义单元格中textfield
的值发生变化时,在View Controller中更改数组。
我的解决方案是在UITextFiled
的{{1}}方法中为cellForRowAt
添加委托,然后我可以在tableview
方法中更改所有数据。因为它们都在一个类中,textFieldDidEndEditing
类。