通过 addSubview 添加后,在父 UIViewController 中调用方法

Posted

技术标签:

【中文标题】通过 addSubview 添加后,在父 UIViewController 中调用方法【英文标题】:Calling method in parent UIViewController, after adding by addSubview 【发布时间】:2011-05-14 16:43:32 【问题描述】:

我有一个 UIViewController 正在创建另一个视图控制器,并将其视图添加为子视图:

在父 UIViewController 中:

SlateMoreView* subView = [[SlateMoreView alloc] initWithNibName:@"SlateMoreView" bundle:nil];
[self.view addSubview:subView.view];

然后我需要在父视图中从子视图调用一个方法。

当我使用 [self.navigationController pushViewController: subView animated: YES] 添加子 UIViewController 时,我已经看到了如何执行此操作,因为我可以使用这种代码找到父级:

在子视图UIViewController中:

NSArray* viewControllerArray = [self.navigationController viewControllers]
int parentViewControllerIndex = [viewControllerArray count] - 2;
SlateView* slateView = [viewControllerArray objectAtIndex:parentViewControllerIndex];

...然后我可以向它发送消息。但是由于我是使用 addSubView 手动添加子视图的,所以不能这样做。

谁能想到我可以如何与我的父 UIViewController 交谈?

谢谢!

【问题讨论】:

【参考方案1】:

UIViews 有一个 superview 属性,这似乎是您正在寻找的。​​p>

此外,您可能不希望像这样嵌套UIViewController 的视图,除非您非常刻意构建自定义包含视图控制器。见http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

【讨论】:

阅读那篇文章。非常翔实,谢谢。我选择这样做的原因是因为它是在父视图上方移动的较小视图。你认为我应该研究模态视图控制器的东西吗? 将视图控制器呈现为模态不会让您控制它的位置或允许您更改其预期大小。我认为您可能想要这样做: 1. 只需构建一个没有专用控制器的视图,将其添加为子视图,并根据需要使用现有控制器对其进行管理。或 2. 使用一些负责管理其行为的自定义控制器创建一个视图。让该控制器扩展 NSObject 而不是 UIViewController,这样您就不会错误地假设它可以像 UIViewController 通常那样工作。【参考方案2】:

您可能需要考虑是否可以使用 NSNotifications 解决您的问题。当感兴趣的听众(您的超级视图)需要了解的事件发生时,您可以从您的子视图发布通知。当 superview 收到通知时,它可以运行您希望的任何代码。一直以来,子视图都不需要知道父视图。

这是减少类之间相互依赖的一种方法。

您也可以使用委托作为另一种选择。

【讨论】:

【参考方案3】:

当您将视图作为子视图添加到视图层次结构时,您将其放入响应者链中。您可以沿着响应者链向上到达视图控制器,因为由UIViewController 控制的UIViewUIViewController 作为其nextResponder

id object = theSubview;
do 
    object = [object nextResponder];
 while ( ![object isMemberOfClass:[YourViewController class]] );

// object has the view controller you need.

【讨论】:

以上是关于通过 addSubview 添加后,在父 UIViewController 中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

UIView的属性方法大全

Swift:addSubview 后背景消失

如何在一行代码中将多个子视图添加到我的 iOS 视图中? (也许通过“monkeypatching”一个 `addSubviews` 实例方法到 UIView?)

转换后 addSubview 不起作用

使用 AutoLayout addSubview 到 UITableView 后崩溃

UIWindow addSubview 处理事件