如何引用superview的navigationController

Posted

技术标签:

【中文标题】如何引用superview的navigationController【英文标题】:How to reference superview's navigationController 【发布时间】:2010-11-03 22:48:44 【问题描述】:

我有一个可重用的 UITableViewController 子类,称之为“tableVC”。选择表格行会将详细视图控制器推送到导航堆栈上。 tableVC 实例只有在它自己被推送时才具有有效的 navController。到目前为止一切顺利。

我需要将 tableVC 的视图嵌入到另一个 viewController 已被推送的视图中。由于该超级视图的 viewController 已被推送,因此它具有有效的 navCon。我无法从 tableVC 获得那个 navCon,因为 tableVC 尚未被推送,因此其他完全可重用的 tableVC 无法推送详细信息。 除了在特殊的 UINavigationController 变量中进行黑客攻击之外,是否有一种干净的方法来引用该 navCon,如果 self.navigationController 为 nil,则访问该黑客攻击?似乎是一个足够普遍的情况,应该有一个最佳实践。 非常感谢任何见解。 -迈克

【问题讨论】:

【参考方案1】:

简短的回答 AFAIK 是否定的,没有其他方法可以访问您所追求的导航控制器。

中等答案是您可以覆盖表格视图控制器的 navigationController 属性以使其可写:

@interface myTableViewController : UITableViewController 
  UINavigationController *navigationController;

@property (nonatomic, retain) UINavigationController *navigationController;

当您将其视图添加为子视图时,这将允许您将其设置为推送的 VC 的导航控制器。当您正常将其推送到导航控制器堆栈时,它仍然可以按承诺工作。

长答案是 Apple 不鼓励你做的事情。来自"About Custom View Controllers" 中的View Controller Programming Guide:

注意:如果要分单 筛选多个区域并进行管理 每个单独,使用通用 控制器对象(自定义对象 从 NSObject 下降)而不是 查看控制器对象来管理每个 屏幕的子部分。然后使用一个 单视图控制器对象 管理通用控制器对象。 视图控制器协调 整体屏幕交互,但 根据需要将消息转发给 它管理的通用控制器对象。

我遇到了您所描述的问题并最终采取了一种方法suggested by Matt Gallagher on Cocoa with Love:创建一个单独的控制器类,它继承自 NSObject(而不是 UIViewController)并实现 UITableViewDelegate 和 UITableViewDataSource 来管理表视图。他的帖子中有示例代码,如果您决定走这条路,这将非常有用。当我这样做时,它在很大程度上只是简单地更改了我的自定义 UITableViewController 子类中的继承声明。

【讨论】:

Matt 的代码解决的问题与我的稍有不同,但您的讨论让我意识到,与其将 NavCon 的引用压缩到 tableVC 中,更简洁的设计是让 tableVC 委派推送工作细节VC。谢谢,非常感谢。【参考方案2】:

在 UIViewController 中嵌入 UITableViewController 是什么意思?我可以看到 UITableView 如何嵌入到 UIView 中(我有这样做的代码)。但是嵌入视图控制器...

当我在 UIView 中有一个 UITableView 时,我将 UIViewController 子类化并让它实现 UITableViewDelegate 和 UITableViewDataSource,如下所示:

@interface MyViewController : UIViewController
        < UITableViewDelegate, UITableViewDataSource >
//...    
@end

这允许一个 IUViewController 工作双重职责。这会在某种程度上损害您的独立 UITableViewController。但是您可以创建某种委托类来实现 UITableViewDelegate 和 UITableViewDataSource,并为您的 UIViewController 提供一个引用(作为 ivar)的实例。

只是一个想法......

【讨论】:

我没有嵌入 UITableView Controller,我嵌入的是 view

以上是关于如何引用superview的navigationController的主要内容,如果未能解决你的问题,请参考以下文章

如何理解superview

如何根据superView设置UIView大小

如何在 Superview 的视图中插入视图? (iOS)

如何在 iOS 8 上为 superview 制作 clearColor

如何根据iOS中superview的大小制作UIButton网格?

如何从 iPad 中的子视图更新 Superview?