在TableView的CustomCell中获取UIViewController

时间:2013-03-22 04:26:29

标签: ios objective-c uitableview

我有一个UIViewController名为“MainView”,其中一个UITableView名为“tblLists”
tblLists生成customCell - “customCellList”。

我的问题是我可以在MainView课程中获得customCellList的实例(自我)。

我尝试使用superview的东西,但没有得到MainView。我想在没有协议的情况下实现这一点。

所以需要你的帮助。

5 个答案:

答案 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类。