UIViewController中的parentViewController属性是只读的,但我筑巢自定义视图控制器,并希望使用这个属性。
但是,由于它是只读的,我发现没有其他的方法来设置该属性,我quesion是: 我该如何设置呢?
显然,UINavigationController的可-pushViewController莫名其妙定置物业,所以可以-presentModalViewController,所以它必须是可行的。
我知道,我可以再补充我自己的UIViewController属性,但我敢肯定,parentViewController是,在原则上,正确的属性。
但是,由于它是只读的,我发现没有其他的方法来设置该属性,我quesion是:我该如何设置呢?
如果是readonly
,你不能没有得到一个使用点符号编译器错误 。
但是,您可能能够使用类别为自定义添加modifyParentViewController
方法到UIViewController
类。
即使属性是只读的,变量本身可能是修改的,如果不@protected
。 如果@protected
,继承视图控制器可以让你修改变量的选择。
解决方法是:
- (void)setParentController:(UIViewController*)parent{
[self setValue:parent forKey:@"_parentViewController"];
}
它不会导致连接问题!
PS:不要使用“setParentViewController”作为方法的名称,因为这种方法在私有API和苹果存在着说:“那是包含在你的应用程序中的非公开API是setParentViewController :.
如果您在源代码中使用相同的名称定义的方法与上述的API,我们建议改变你的方法名称,以便它不再与苹果的私有API碰撞避免你的申请被标记有未来的意见书。
请您下次更新解决这个问题。”
我意识到这个问题是iOS 5的问过,但所指,当你想巢UIViewControllers你应该使用addChildViewController。 这也将自动设置parentViewController属性。
- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
你可以阅读更多关于“创建自定义内容视图控制器” 苹果 。
我试图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];
}
我所有的表视图控制器现在adoptedTableViewControllers。 他们需要父母的主要原因是使它们可以在给导航堆栈推视图控制器,从而使由导航控制器吸气透明地处理。
这将是很好,如果parentViewController不只读的,但在我的涉猎与_parentViewController我发现有更多到ViewController层次远远不止这些财产。 我觉得可能是很多耦合和责任的这种关系,苹果还没有为群众清理不够。 举例来说,我动了起来导航层次,我不能修复时,发现一个奇怪的取消选择的行为。 也许UINavigation控制器反映他们的类顶部控制器和不同的表现?
总之,它确实是只读的,并且没有清洗或简单的解决方法。 你刚刚得到它周围的建筑师。
parentViewController为NavigationViewControllers和呈现模态视图控制器的目的,也没有办法来设置无方法pushViewController或presentModalViewController财产。 该parentViewController是只能由UIViewController类和UINavigationController的类来读取一个只读属性,这些子类将无法访问设置属性。
它看起来像调用setParentViewController:方法效果。
[childViewController setParentViewController:self];
然而,这仍然会产生编译器警告。 其中,国际海事组织,是指不这样做(我子类来代替)。