我有一个可重用的UITableViewController子类,称之为“tableVC”。选择表格行会将该详细视图控制器推送到导航堆栈。 tableVC实例在被推送时只有一个有效的navController。到目前为止一切都很好。
我需要将tableVC的视图嵌入另一个已推送viewController的视图中。由于superview的viewController已被推送,因此它具有有效的navCon。我无法从tableVC获得navCon,因为tableVC还没有被推送,所以否则完全可重用的tableVC无法推送细节。 是否有一种干净的方式来引用navCon,除了黑客入侵一个特殊的UINavigationController变量,如果self.navigationController是nil,那么访问hack?似乎是一个足够普遍的情况,应该有一个最好的做法。 任何见解都非常感谢。 -Mike
答案 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)。
只是一个想法......