以编程方式执行时,UIViewController 显示为黑屏

UIViewController appears as Black screen when doing programmatically

UIViewController 在以编程方式处理时显示为黑屏

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

NSString *user = (NSString *) [self.friends objectAtIndex:indexPath.row];
ChatViewController *chatController = [[ChatViewController alloc] initWithUser:user];
[self presentModalViewController:chatController animated:YES];

}

下面给出的代码在聊天视图控制器中

 - (id) initWithUser:(NSString *) userName {
if (self = [super init]) {
    chatWithUser = userName;   
}
return self;
}

当我使用情节提要 segue 执行此操作时,只有表格视图行被选中但不显示 ChatViewController

else if ([segue.identifier isEqualToString:@"showChatView"]) {
    ChatViewController *viewController  = (ChatViewController *)segue.destinationViewController;
      viewController.chatWithUser = friends;
}

如果有人能找出我做错了什么。非常感谢。

谢谢你的帮助。

presentModalViewController:animated: 已弃用(自 iOS 6 起),您应该使用 presentViewController:animated:completion:

但是,看起来您正在使用 segue 来访问您的 ChatViewController,因此您甚至不必显示视图控制器,因为这是由 Interface Builder 处理的。如果您的 segue 设置正确,请将 presentModalViewController:animated: 替换为 [self performSegueWithIdentifier:@"showChatView" sender:nil];

编辑 您应该将 ChatViewController 设置移动到 prepareForSegue:sender: 方法,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *user = (NSString *)[self.friends objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"showChatView" sender:user];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showChatView"]) {
        NSString *user = (NSString *)sender;
        ChatViewController *chatVC = (ChatViewController *)[segue destinationViewController];
        // No need to have an init method with the user property since Interface Builder does that for you.
        chatVC.chatWithUser = user;  // Expose this property in ChatViewController's header file if it's not already
}

这应该是您在代码中需要做的全部。

呈现与显示视图控制器

UIViewController class 提供了两种显示视图控制器的方法:

  • showViewController:sender:showDetailViewController:sender: 方法提供了最自适应和最灵活的方式来显示视图控制器。这些方法让呈现视图控制器决定如何最好地处理呈现。例如,容器视图控制器可能会将视图控制器合并为一个子视图控制器,而不是以模态方式呈现它。默认行为以模态方式呈现视图控制器。

  • presentViewController:animated:completion: 方法始终以模态方式显示视图控制器。调用此方法的视图控制器可能不会最终处理演示文稿,但演示文稿始终是模态的。此方法适应水平紧凑环境的呈现样式。

showViewController:sender:showDetailViewController:sender: 方法是启动演示文稿的首选方法。视图控制器可以在不知道视图控制器层次结构的其余部分或当前视图控制器在该层次结构中的位置的情况下调用它们。这些方法还可以更轻松地在应用程序的不同部分重用视图控制器,而无需编写条件代码路径。

请参阅此 link 以了解以编程方式转场和使用界面构建器之间的区别。希望对您有所帮助。

@timgcarlson 的回答非常适合解决您的问题。

根据@Sneha 的建议,我添加了一段感觉有用的段落。