33

作为 Cocoa 的新手,我在Interface Builder,UIViewController和朋友方面遇到了一些问题。

我有一个在 xib 中定义的UIViewController子类UIView,并且控制器的视图出口连接到视图。xib 的“文件所有者”设置为myViewcontroller子类。

在这个实例中,以下用于加载控制器/视图(从主视图控制器)的代码无法按预期工作:

if ( self.myViewController == nil )
{
    self.myViewController = [[MyViewController alloc]
        initWithNibName:@"MyViewController" bundle:nil];
}

[self.navigationController 
    pushViewController:self.myViewController animated:YES];

在 MyViewController 的方法中,我放置了断点并记录消息以查看发生了什么:

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        NSLog(@"initWithNibName\n");
    }

    return self;
}

-(void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@"viewDidLoad\n");
}

预期结果

-initWithNibName和方法都-viewDidLoad被调用,并显示了myViewController的视图。

观察结果

只有-initWithNibName被调用,视图不显示。

我错过了什么吗?任何人都可以推荐任何要检查的东西吗?(特别是在非常不透明的界面生成器工具中)。

4

11 回答 11

36

回复:找到解决方案!!!!!!

确实这似乎是一个可行的解决方案,但真正的技巧不是将view.hidden属性设置为 NO,使视图从 nib 文件加载的原因是调用UIViewController's视图方法,视图仅在第一次调用 view 方法。

从这个意义上说,一条简单的[viewController view]消息将强制视图从 nib 文件加载。

于 2010-08-29T23:22:53.033 回答
15

好的,我有一个部分答案-也许大师可以解释更多。问题是:

[self.navigationController pushViewController:myViewController animated:YES];

仔细观察,在这种情况下self.navigationController是 nil - 所以推送消息无处可去。

相反,如果我发送:

[self.view addSubview:self.myViewController.view];

然后视图出现并被-viewDidLoad调用。

我不完全确定为什么self.navigationController没有在这种情况下设置 - 我唯一能想到的是它selfUIViewController而不是UITableViewControllerpushViewController代码来自哪里)的子类。

此外,静默允许消息为零似乎是一个坏主意,尽管这些答案 另有说明。另请参阅我的问题

最终编辑:

在下面的评论中的答案,我已经意识到我实际上追求的显示功能(假设 myViewController 是模态的)是:

[self presentModalViewController:myViewController animated:YES];

感谢大家的有益回复。

于 2009-05-27T05:40:45.983 回答
10

找到解决方案!!!!

甚至像这样无害的事情也会使viewDidLoad方法调用发生。

在 alloc 之后插入这个initWithNibName

viewController.view.hidden = NO; //calls viewDidLoad
于 2010-01-15T03:55:51.897 回答
5

确保 File's Owner(您的 viewController 子类)中的视图出口连接到实际视图(即您在屏幕上看到的用于构建 UI 的 480X320 画布)

于 2009-05-27T02:15:05.583 回答
5

很有可能您可能没有将假定ViewController的输入main.storyboard从您创建Identity Inspector的自定义链接到class您创建的自定义。您可能可以通过 segue 从其他视图控制器导航到该控制器,但不会执行任何等viewDidLoad()viewWillAppear()

于 2016-05-11T06:08:13.740 回答
4

只需使用

- (void)viewDidAppear:(BOOL)animated{ 
        [super viewDidAppear:animated];
        //Your Code here
  }

而不是 viewDidLoad 方法。

于 2012-03-04T10:48:16.040 回答
4

回想起来有些明显的另一个原因:如果viewController.view在代码中设置了,则不会触发 viewDidLoad 事件。

于 2015-10-18T08:56:46.747 回答
3

对我来说,这似乎是一个大写问题。您在调用 pushViewController 时 引用的是类MyViewController而不是属性。myViewController

于 2009-05-27T02:22:21.823 回答
2

检查您的运行日志是否有错误。几乎可以肯定的是,NIB 没有加载,因此应该有错误。最可能的原因是未能将其放入捆绑包中。查看您的“复制资源”构建阶段并确保实际复制了 XIB。为模拟器构建,然后进入构建目录并确保 NIB 在 .app 包中。

于 2009-05-27T02:47:29.713 回答
0

除了这里的其他答案,

当您从情节提要中实例化 ViewController 的标识符不正确时,通常会发生这种情况。例如

[[self getStoryboard] instantiateViewControllerWithIdentifier:MyVC];

如果MyVC是某个其他 ViewController 的标识符,则可能会发生这种情况。

OPnib在这里使用而不是故事板。但答案适用。

于 2020-01-31T11:21:12.093 回答
0

该页面已呈现但在调试视图层次结构和设备(模拟器也)中不可见,问题发生基于并且我找到了修复:

func viewWillLayoutSubviews{
     if day == true{
            self.view.backgroundColor = .clear
     }else{
            self.view.backgroundColor = .blue
     }
}

不要尝试在 layoutsubviews 的功能中实现 self.view(viewcontrollers 视图)。所以最好在 viewwillappear 或 viewdidload 中使用 self.view。此问题从 v-14 设备开始。

希望它也适合你。

于 2021-01-30T06:16:00.913 回答