如何设置parentViewController在UIViewController中?(How to

2019-08-04 05:07发布

UIViewController中的parentViewController属性是只读的,但我筑巢自定义视图控制器,并希望使用这个属性。

但是,由于它是只读的,我发现没有其他的方法来设置该属性,我quesion是: 该如何设置呢?

显然,UINavigationController的可-pushViewController莫名其妙定置物业,所以可以-presentModalViewController,所以它必须是可行的。

我知道,我可以再补充我自己的UIViewController属性,但我敢肯定,parentViewController是,在原则上,正确的属性。

Answer 1:

但是,由于它是只读的,我发现没有其他的方法来设置该属性,我quesion是:我该如何设置呢?

如果是readonly ,你不能没有得到一个使用点符号编译器错误 。

但是,您可能能够使用类别为自定义添加modifyParentViewController方法到UIViewController类。

即使属性是只读的,变量本身可能是修改的,如果不@protected 。 如果@protected ,继承视图控制器可以让你修改变量的选择。



Answer 2:

解决方法是:

   - (void)setParentController:(UIViewController*)parent{
 [self setValue:parent forKey:@"_parentViewController"];
    }

它不会导致连接问题!

PS:不要使用“setParentViewController”作为方法的名称,因为这种方法在私有API和苹果存在着说:“那是包含在你的应用程序中的非公开API是setParentViewController :.

如果您在源代码中使用相同的名称定义的方法与上述的API,我们建议改变你的方法名称,以便它不再与苹果的私有API碰撞避免你的申请被标记有未来的意见书。

请您下次更新解决这个问题。”



Answer 3:

我意识到这个问题是iOS 5的问过,但所指,当你想巢UIViewControllers你应该使用addChildViewController。 这也将自动设置parentViewController属性。

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);

你可以阅读更多关于“创建自定义内容视图控制器” 苹果 。



Answer 4:

我试图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控制器反映他们的类顶部控制器和不同的表现?

总之,它确实是只读的,并且没有清洗或简单的解决方法。 你刚刚得到它周围的建筑师。



Answer 5:

parentViewController为NavigationViewControllers和呈现模态视图控制器的目的,也没有办法来设置无方法pushViewController或presentModalViewController财产。 该parentViewController是只能由UIViewController类和UINavigationController的类来读取一个只读属性,这些子类将无法访问设置属性。



Answer 6:

它看起来像调用setParentViewController:方法效果。

[childViewController setParentViewController:self];

然而,这仍然会产生编译器警告。 其中,国际海事组织,是指不这样做(我子类来代替)。



文章来源: How to set parentViewController in UIViewController?