如何引用superview的navigationController

时间:2010-11-03 22:48:44

标签: iphone uinavigationcontroller subview

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

我需要将tableVC的视图嵌入另一个已推送viewController的视图中。由于superview的viewController已被推送,因此它具有有效的navCon。我无法从tableVC获得navCon,因为tableVC还没有被推送,所以否则完全可重用的tableVC无法推送细节。  是否有一种干净的方式来引用navCon,除了黑客入侵一个特殊的UINavigationController变量,如果self.navigationController是nil,那么访问hack?似乎是一个足够普遍的情况,应该有一个最好的做法。  任何见解都非常感谢。 -Mike

2 个答案:

答案 0 :(得分:4)

答案简短 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子类中的继承声明。

答案 1 :(得分:0)

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

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

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

这允许一个IUViewController工作双重任务。这会在某种程度上损害您自包含的UITableViewController。但是你可以创建一些实现UITableViewDelegate和UITableViewDataSource的委托类,并为你的UIViewController提供一个引用的实例(如ivar)。

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