导航控制器有时会使用情节提要推送到黑屏
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)?
是的,无论您喜欢哪种用途,它们都是相同的用途,您需要使用代表来传递产品,我编辑了我的帖子,所以你看看应该怎么做以上是关于导航控制器有时会使用情节提要推送到黑屏的主要内容,如果未能解决你的问题,请参考以下文章