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

时间:2014-07-19 14:48:47

标签: ios uinavigationcontroller autolayout nslayoutconstraint

我将导航控制器的根视图控制器指定为具有使用autolayout约束的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视图中看不到任何内容。 如果我在我的app委托中将窗口rootviewcontroller设置为'vc',则tableview会显示自己并填充它。如果我将rootviewcontroller设置为'navigationController',我根本看不到tableview。

有什么问题?我错过了什么/忘记添加什么?

1 个答案:

答案 0 :(得分:1)

问题在于这一行,

[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];

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