我尝试了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] )
{
return [super navigationController];
}
else
{
return surrogateParent.navigationController;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
我的所有表视图控制器现在都是AdoptedTableViewController。它们需要父级来将视图控制器推到导航栈中,所以这由导航控制器获取器自动处理。
如果parentViewController不是只读的就好了,但我在尝试使用_parentViewController时发现ViewController层次结构并不仅限于该属性。我认为这种关系中可能存在很多耦合和责任,Apple没有为大众清理干净。例如,我注意到在向上移动导航层次结构时出现了奇怪的取消选择行为,我无法解决。也许UINavigation控制器反映了其顶部控制器的类并且表现不同?
总之,它确实是只读的,没有简单干净的解决方法,你只需要绕过它来设计架构。