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

时间:2015-01-13 21:11:41

标签: ios objective-c uitableview uiviewcontroller

在处理程序时,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];

}

以下给出的代码位于chatviewcontroller

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

当我使用storyboard segue时,只有tableview行被选中但没有显示ChatViewController

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

如果有人能弄清楚我做错了什么。会非常感激。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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
}

这应该是您在代码中需要做的所有事情。

答案 1 :(得分:0)

演示与显示视图控制器

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

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

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

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

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

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

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