我尝试了 Alex 的建议,为 UIViewController 制作一个类别,它在模拟器中有效,但在我的手机上无效。这是类别
@interface UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent;
@end
@implementation UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent
{
_parentViewController = parent;
}
@end
它可以编译并正常工作,但请注意下划线成员有点不妥。这就是在针对 3.0 SDK 进行编译时导致链接器错误的原因。
我有一个包含 2 个子视图的容器视图,其中一个表就是其中之一。该表需要一个父级,以便它可以与导航栏交互,等等。
我将使用此解决方案:
@interface AdoptedTableViewController : UITableViewController {
UIViewController* surrogateParent;
}
-(UINavigationController*)navigationController;
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent;
@end
@implementation AdoptedTableViewController
@synthesize surrogateParent;
-(UINavigationController*)navigationController
{
if( [super navigationController] )//self.navigationController )
{
return [super navigationController];
}
else
{
return surrogateParent.navigationController;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
我现在所有的表格视图控制器都采用了TableViewControllers。他们需要父母的主要原因是他们可以将视图控制器推送到导航堆栈,以便由导航控制器 getter 透明地处理。
如果 parentViewController 不是只读的,那就太好了,但是在我涉足 _parentViewController 时,我发现 ViewController 层次结构不仅仅是那个属性。我认为在这种关系中可能存在很多耦合和责任,Apple 还没有为大众解决足够的问题。例如,在向上移动导航层次结构时,我注意到一个奇怪的取消选择行为,我无法修复。也许 UINavigation 控制器反映了它们的顶级控制器的类并且行为不同?
简而言之,它确实是只读的,没有干净或简单的解决方法。你只需要围绕它进行架构设计。