【问题标题】:ParentViewController is nil no matter what I do无论我做什么,ParentViewController 都是 nil
【发布时间】:2011-01-09 13:40:30
【问题描述】:

我的控制器层次结构:

  • TabBaseController (UITabBarController)
    • 子类控制器

在我的 tabbasecontroller 中,我有一个导航栏按钮,它使用 presentModalViewController 方法将子类控制器翻转到第二个 UITabBarController。

所以我的问题是:为什么不

self.parentViewController

在第二个UITabBarController 中工作?是零。

我正在第二个 UITabBarController 的 viewDidLoad 方法中尝试这个:

if (self.parentViewController == nil) {
   NSLog(@"Parent is nil");
}

更新

这是 UITabBarController 中的方法,带有显示它的 navigationItemButton

-(IBAction)openModalTabController:(id)sender {  

if (self.nvc == nil) {
    ModalTabController *vc = [[ModalTabController alloc] init]; 
    self.nvc = vc;
    [vc release];
}

[self presentModalViewController:self.nvc animated:YES];
}

这是我以模态方式呈现的控制器(UITabBarController):

标题:

@interface NewBuildingViewController : UITabBarController {
}
@end

主要:

@implementation NewBuildingViewController

- (id)init {
[super initWithNibName:nil bundle:nil];

ViewController1 *vc1 = [[ViewController1 alloc] init];
ViewController2 *vc2 = [[ViewController2 alloc] init];
ViewController3 *vc3 = [[ViewController3 alloc] init];

NSArray *controllers = [[NSArray alloc] initWithObjects:vc1, vc2, vc3, nil];

[vc1 release];
[vc2 release];
[vc3 release];

self.viewControllers = controllers;
[controllers release];

self.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

return self;
}

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
return [self init];
}

@end

我还想补充一点,这个消息在翻转时显示在控制台(警告):

使用两阶段旋转动画。要使用更平滑的单阶段动画,此应用程序必须删除两阶段方法实现。 旋转多个视图控制器或非窗口委托的视图控制器时,不支持使用两阶段旋转动画

【问题讨论】:

  • 你能检查一下你的 viewDidLoad 是否被调用 before 控制器被添加到父级吗?如果您过早访问视图属性,可能会发生这种情况。
  • 我怀疑这是一个问题,但我会尝试。来自 Apple:因为 UITabBarController 类继承自 UIViewController 类,所以标签栏控制器有自己的视图,可通过 view 属性访问。部署选项卡栏界面时,您必须将此视图安装为窗口的根目录。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。
  • 啊,这是重要的信息。是的,不要这样做。请参阅您的其他问题以获取解释。 :-)

标签: iphone objective-c


【解决方案1】:

如果您要展示如何呈现第二个 UITabBarController,将会很有帮助。您是否可能忽略了 UITabBarController 类参考中的以下警告?

部署标签栏界面时,您必须将此视图安装为窗口的根目录。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。

【讨论】:

  • 我怀疑您所做的一切都很好,并且 Eiko 对您的问题的评论是准确的。 -viewDidLoad 可以在控制器显示为模式并设置其 parentViewController 之前调用。考虑将此检查移至-viewWillAppear-viewDidAppear:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2023-01-30
  • 2020-03-07
  • 2020-08-18
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多