如何从子视图访问 ParentViewController 方法?

Posted

技术标签:

【中文标题】如何从子视图访问 ParentViewController 方法?【英文标题】:How to access ParentViewController method from subview? 【发布时间】:2014-03-25 09:25:35 【问题描述】:

我创建了一个调用UIViewController 并将其加载为subview 的方法,就像这样

cameraViewController = [[CameraViewController alloc] init];
        cameraViewController.view.frame = CGRectMake(0.0, 0.0, screenHeight, screenWidth);
        [cameraViewController drawCameraView:htmlProjID ProjectGUID:selectedProjGUID DoorGUID:cell.currentItem.doorGUID Info:nil doorName:cell.currentItem.doorDesc ViewName:@"Finishing"];
        [self.view addSubview:cameraViewController.view];

我想知道是否有一种简单的方法可以从原始UIViewController 访问camerViewController(subview) 的方法?

【问题讨论】:

【参考方案1】:

这可能会返回你想要得到的东西:

 id mainViewController = [self.view.superview nextResponder];

Apple 的 -[UIResponder nextResponder] 文档:

UIView 通过返回管理它的 UIViewController 对象(如果有)或其父视图(如果没有)来实现此方法

除此之外,您可以从here 获得想法。

【讨论】:

感谢这完美的工作。要去阅读 nextResponder 我一直在使用委托做一些工作......我非常讨厌委托【参考方案2】:

根据此答案定义 protocol 并使用 delegate...

How do I create delegates in Objective-C?

【讨论】:

【参考方案3】:

NSNotifications 在这种情况下总是很方便。你只需在camerViewController的viewDidLoad中定义一个观察者:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(YourMethod:) name:@"YourNSNotificaitionName" object:nil];

然后您只需从原始视图中发布该名称的 NSNotication:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"YourNSNotificaitionName" object:nil userInfo:Nil];

这将在子视图上调用适当的方法。

【讨论】:

【参考方案4】:

您可以从UIViewController 访问子视图类的公共方法。但由于某些限制,它有时可能无法正常工作。

您可以使用协议来实现这些事情。为此,请遵循以下内容:

声明要从哪个 ViewController 调用方法的协议 使用委托协议调用子视图的方法

执行它的其他方法是将该方法创建到 AppDelegate 文件中并从中调用。

【讨论】:

以上是关于如何从子视图访问 ParentViewController 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何从子视图控制器访问父视图控制器的视图?

从子视图访问属性到 ViewController Swift

CodeIgniter:从子文件夹访问视图

绑定视图 - 如何从子列表中获取父属性的详细信息

您将如何从子视图中呈现ViewController?

是否可以从子网格视图访问父列表视图项目?