11

UIViewController的parentViewController属性是只读的,但我嵌套自定义视图控制器并想使用此属性。如何在UIViewController中设置parentViewController?

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

显然,UINavigationController可以在-pushViewController中以某种方式设置属性,所以可以使用-presentModalViewController,因此它必须是可能的。

我知道我可以添加自己的UIViewController属性,但我确定parentViewController原则上是正确的属性。

+0

我认为谁投下每个答案在这个线程可以给出一个理由:) – willcodejavaforfood 2010-02-17 09:25:31

+0

这不是我,但我怀疑他们不同意使用私人API,并投票下来使用私人API的建议似乎是在SO上通用。也许他们是苹果痣。 – 2010-05-29 03:43:28

回答

1

但是,由于它是只读的,并且我找不到其他方法来设置此属性,所以我的问题是:如何设置它?

如果是readonly,则不能使用点符号而不会得到compiler error

但是,您可能可以使用categoriesUIViewController类添加自定义modifyParentViewController方法。

即使属性是只读的,如果它不是@protected,变量本身可能是可修改的。如果它是@protected,则视图控制器的子类可能允许您选择修改该变量。

+0

这样做对我来说太脏了,但我想如果我坚持使用parentViewController,这将是非常唯一可行的方法。
虽然我会使用自定义的UIViewController属性。 – mrueg 2009-09-10 22:22:23

0

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

2

我试过亚历克斯的建议买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控制器反映他们的顶级控制器的类别,行为有所不同?

总之,它确实是只读的,没有干净或简单的解决方法。你只需要围绕它构建。

0

它看起来像调用setParentViewController:方法的作品。

[childViewController setParentViewController:self]; 

但是,这仍然会生成一个编译器警告。其中,国际海事组织,意味着不这样做(我代之以)。

11

解决办法是:

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

它不会导致连接问题!

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

如果您已经在源代码中定义了一个与上述API名称相同的方法,但我们建议更改您的方法名称,使其不再与Apple的私有API冲突,以避免将您的应用程序标记为未来提交的内容。在下次更新中解决此问题...“

+2

这不会导致App Store拒绝?这解决了我的一些模态演示问题,但它很可怕。 – 2012-10-24 14:52:51

9

我意识到这个问题是在iOS 5之前问过的,但是对于参考,当你想嵌套UIViewControllers时,你应该使用addChildViewController。这也会自动设置parentViewController属性。

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

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

+1

这适用于我,在子视图控制器上设置parentViewController属性。不知道为什么它不是被接受的答案。 – KyleStew 2013-05-09 14:08:11

相关问题