以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容

Posted

技术标签:

【中文标题】以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容【英文标题】:rootviewcontroller programmatically created not showing content of viewcontroller assigned 【发布时间】:2014-07-19 14:48:47 【问题描述】:

我将导航控制器的根视图控制器分配为带有 tableview 的视图,使用自动布局约束来填充整个屏幕。以下是我如何将导航控制器设置为我的根视图控制器和导航控制器中的根视图控制器:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    TestViewController *vc = [[TestViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];
    [self.window setRootViewController:navController];
    [self.window makeKeyAndVisible];
    return YES;

当视图控制器加载时我知道它有,因为它调用 tableview 委托方法和数据源方法如下:

- (void)setup 
    items = @[@1014, @2022, @3001, @4212, @5323, @6345, @7111, @8010, @9040, @10500];
    viewTableView = [UITableView new];
    viewTableView.delegate = self;
    viewTableView.dataSource = self;
    [viewTableView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.view addSubview:viewTableView];
    self.title = @"overlay test";

导航栏标题已成功填充“覆盖测试”。

- (void)setControllerConstraints 
    NSDictionary *viewsDictionary = @@"tableView":viewTableView;
    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[tableView]-0-|" options:0 metrics:nil views:viewsDictionary];
    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[tableView]-0-|" options:0 metrics:nil views:viewsDictionary];
    [self.view addConstraints:horizontalConstraints];
    [self.view addConstraints:verticalConstraints];


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setup];
    [self setControllerConstraints];
    NSLog(@"TestViewController did load");

我可以看到正在打印 viewdidload 末尾的 NSLog。

- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.



#pragma mark - UITableViewDataSource Delegate Methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    NSLog(@"count: %i", [items count]);
    return [items count];

项目计数返回为 10。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"exampleCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    
    [cell.textLabel setText:[[items objectAtIndex:indexPath.row] stringValue]];

    return cell;

但是,我在 viewcontrollers 视图中看不到任何内容。 如果我在我的应用程序委托中将窗口 rootviewcontroller 设置为“vc”,则 tableview 会显示自己并填充它。如果我将 rootviewcontroller 设置为“navigationController”,我根本看不到 tableview。

有什么问题?我缺少/忘记添加什么?

【问题讨论】:

不,它不使用 xib 文件或情节提要,并使用 NSLayoutConstraints 将帧大小设置为屏幕的宽度和高度。我链接“viewdidload”、“setup”和“setControllerConstraints”的方法希望能反映这一点。 NSLogviewDidAppear中视图控制器的视图框架。 框架被设置为 0 宽度和高度无法弄清楚为什么。 【参考方案1】:

问题是这一行,

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

对于控制器的主视图,您不应将该属性设置为 NO。我不确定为什么当控制器不在导航控制器中时它会起作用,但我得到了奇怪的结果,即控制器的 viewDidAppear 方法没有在该行存在的情况下调用(当控制器未嵌入导航控制器时)。

【讨论】:

@jimbob,真的吗?我复制了您的代码,删除该行解决了问题。你确定你删除了正确的行吗? @jimbob,你也不应该那样做。对于您自己添加的子视图,您应该只将 translatesAutoresizingMaskIntoConstraints 设置为 NO。 好的,我在这里看到了问题。回答了我的问题!谢谢!

以上是关于以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容的主要内容,如果未能解决你的问题,请参考以下文章

有关以编程方式创建UITextField的问题

以编程方式使用 UINavigationController 设置 RootViewController

如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController

以编程方式更改 tabBar 项目?

当 UITabBar 不是 rootViewController 时,如何以编程方式将 UITabBar 与具有 NIB 的不同 ViewController 链接

以编程方式设置 rootViewController 不起作用,仅在 Xcode 11 中从情节提要中选择初始视图控制器