导航控制器有时会使用情节提要推送到黑屏

Posted

技术标签:

【中文标题】导航控制器有时会使用情节提要推送到黑屏【英文标题】:Navigation controller sometimes pushes to black screen using storyboard 【发布时间】:2014-03-20 16:53:07 【问题描述】:

我在 Xcode 5 中使用故事板,我试图从 UINavigationController 中的 UITableViewController 推送到 UIViewController,但有时会出现黑屏(可能有 75% 的时间)。通过阅读其他帖子,我学会了使用instantiateViewControllerWithIdentifier: 方法在推送之前实例化我正在推送的视图控制器,所以我的代码如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if (indexPath.row < self.objects.count) 
        PFObject *retrievedProduct = [self.objects objectAtIndex:indexPath.row];
        Product *product = [[Product alloc] init];

        // set properties for retrieved product 
        // (code omitted)

        //load product detail page
        self.detailPage = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"MPDetailPageViewController"];
        self.detailPage.product = product;

        //Bring to detail page
        [self.navigationController pushViewController:self.detailPage animated:YES];

     else if (self.paginationEnabled) 
        // load more
        [self loadNextPage];
    

在 MPDetailPageViewController 中,我在 viewDidAppear 中执行 NSLog,即使屏幕为黑色,它仍在打印。

任何建议将不胜感激。

谢谢, 蒂姆

【问题讨论】:

您是否在情节提要上添加了storyBoardId 标识符 是的,我推送的 ViewController 的 Storyboard ID 为“MPDetailPageViewController” 【参考方案1】:

看看这是否适合你:

首先确保头文件被导入:

#import "MPDetailPageViewController.h"

然后这样做:

//the storyboard
UIStoryboard *storyboard = self.navigationController.storyboard;

//the detail controller
MPDetailPageViewController *detailPage = [storyboard 
           instantiateViewControllerWithIdentifier:@"MPDetailPageViewController"];
//set the product
detailPage.product = product;
//Push to detail View
[self.navigationController pushViewController:detailPage animated:YES];

PROJECT NO SEGUE


除非你真的必须这样做,否则以编程方式推送视图会更困难(更多代码)。

只需在故事板中创建一个segue,如果您不确定,请参考one of my answers。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    //[tableView deselectRowAtIndexPath:indexPath animated:YES];
    if (indexPath.row < self.objects.count) 
        //perform the segue
        [self performSegueWithIdentifier:@"detailSegue" sender:sender];
     else if (self.paginationEnabled) 
        // load more
        [self loadNextPage];
    

现在您可以将所有其他代码移至以下 segue 委托:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    // Make sure your segue name in storyboard is the same as this line
 if([segue.identifier isEqualToString:@"detailSegue"])
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    PFObject *retrievedProduct = [self.objects objectAtIndex:indexPath.row];
    Product *product = [[Product alloc] init];

    MPDetailPageViewController *detailVC = (MPDetailPageViewController *)segue.destinationViewController;
    detailVC.product = product;
 

PROJECT USING SEGUE

【讨论】:

@user3217366 你考虑过push segue 会更容易 你有什么可以指点我的例子吗?这应该以编程方式还是通过 Storyboard 完成? @user3217366 使用情节提要,事实上我写了一个这样的答案,check here 在该示例中,所有 3 种方法都完成完全相同的事情吗?由于我需要传递那个“产品”对象,我应该使用方法 2 还是 3(而不是 1)? 是的,无论您喜欢哪种用途,它们都是相同的用途,您需要使用代表来传递产品,我编辑了我的帖子,所以你看看应该怎么做

以上是关于导航控制器有时会使用情节提要推送到黑屏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用给定的根视图控制器和初始视图控制器实例化情节提要?

iOS - 推送到不在情节提要中的视图控制器

在多个情节提要上维护导航栏?

导航控制器黑屏

使用 overCurrentContext 呈现视图控制器,然后推送到导航堆栈会导致导航栏重叠

在代码中修改导航栏会修改情节提要中的多个导航栏