我似乎无法想象我的生活。我有一个自定义表视图单元格,在该单元格中我配置了几个按钮。每个按钮通过故事板segue连接到其他视图控制器。我最近删除了这些segues并将pushViewController方法放在适当的位置。在各个视图之间来回切换按预期工作,但目标视图控制器不显示任何内容!我在下面以一些代码为例。
按钮设置了此方法:
[cell.spotButton1 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside];
// etc...
[cell.spotButton4 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside];
// etc...
showSpotDetails方法包含以下代码:
- (void)showSpotDetails:(id)sender
{
// determine which button (spot) was selected, then use its tag parameter to determine the spot.
UIButton *selectedButton = (UIButton *)sender;
Spot *spot = (Spot *)[spotsArray_ objectAtIndex:selectedButton.tag];
SpotDetails *spotDetails = [[SpotDetails alloc] init];
[spotDetails setSpotDetailsObject:spot];
[self.navigationController pushViewController:spotDetails animated:YES];
}
详情VC确实收到了对象数据。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"spotDetailsObject %@", spotDetailsObject_.name);
}
下面的NSLog方法确实输出传递的对象。此外,详细信息视图控制器中的所有内容都是原样。 VC的细节没有任何改变。自从我删除了segue并添加了pushViewController方法后,它就不会呈现任何内容。也许我在pushViewController方法上遗漏了一些东西?我从来没有真正用这种方式做事,我总是试图使用segues ......
有什么建议吗?
答案 0 :(得分:3)
欢迎来到现实世界。以前,故事板是一个拐杖;你隐藏了关于视图控制器如何工作的真实事实。现在你想扔掉那根拐杖。好!但是现在你必须学会走路。 :)这里的关键是这一行:
SpotDetails *spotDetails = [[SpotDetails alloc] init];
SpotDetails是一个UIViewController子类。你没有在这里做任何会导致这个UIViewController有一个视图的东西。因此,你最终得到一个空白的通用视图!如果你想让UIViewController拥有一个视图,你需要以某种方式给它一个视图。例如,您可以在名为SpotDetails.xib的nib中绘制视图,其中File的Owner是SpotDetails实例。或者您可以在覆盖viewDidLoad
的代码中构建视图的内容。详细信息在UIViewController文档中,或者更好的是,阅读我的书,它告诉您关于视图控制器如何获取其视图的所有内容:
http://www.apeth.com/iOSBook/ch19.html
之前没有出现此问题的原因是您在与视图控制器相同的笔尖中绘制了视图(即故事板文件)。但是当你为一个SpotDetails分配init时,那个与storyboard文件中的不是同一个实例,所以你没有得到那个视图。因此,一种解决方案可以是加载故事板并获取那个 SpotDetails实例,即故事板中的实例(通过调用instantiateViewControllerWithIdentifier:
)。我在这里解释如何做到这一点: