繁体   English   中英

以编程方式执行操作时,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];

}

下面给出的代码在chatviewcontroller中

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

当我使用情节提要segue进行操作时,仅选择了tableview行,但未显示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处理的。 如果您的脚本设置正确,请用[self performSegueWithIdentifier:@"showChatView" sender:nil];替换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类提供了两种显示视图控制器的方式:

  • showViewController:sender:showDetailViewController:sender:方法提供了显示视图控制器的最灵活,最灵活的方法。 这些方法使演示视图控制器可以决定如何最好地处理演示。 例如,容器视图控制器可以将视图控制器作为子级合并,而不是模态地呈现。 默认行为以模态形式显示视图控制器。

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

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

请参考此链接,以了解编程编程和使用界面生成器之间的区别。 希望对您有所帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM