我似乎无法一生解决这个问题。我有一个自定义表格视图单元格,在该单元格中,我配置了一些按钮。每个按钮都通过情节提要脚本连接到其他视图控制器。我最近删除了这些设置,并放置了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 ...
有什么建议么?
最佳答案
欢迎来到真实的世界。以前,情节提要是拐杖。您对自己隐藏了关于视图控制器如何工作的真实事实。现在,您正在尝试扔掉那根拐杖。好!但是现在你必须学会走路。 :)这里的关键是这一行:
SpotDetails *spotDetails = [[SpotDetails alloc] init];
SpotDetails是一个UIViewController子类。您在此处没有执行任何会导致此UIViewController具有视图的操作。因此,您最终将获得空白的通用视图!如果希望UIViewController具有视图,则需要以某种方式为其提供视图。例如,您可以在名为SpotDetails.xib的笔尖中绘制视图,其中文件的所有者是SpotDetails实例。或者,您可以在覆盖
viewDidLoad
的代码中构造视图的内容。详细信息在UIViewController文档中,或者甚至更好,请阅读我的书,它告诉您有关视图控制器如何获取其视图的所有信息:http://www.apeth.com/iOSBook/ch19.html
之前没有出现此问题的原因是,您在与视图控制器(即情节提要文件)相同的笔尖中绘制了视图。但是,当您分配初始化一个SpotDetails时,该实例与情节提要文件中的实例不同,因此不会获得该视图。因此,一种解决方案可能是加载情节提要并获取该SpotDetails实例,即在情节提要中的一个实例(通过调用
instantiateViewControllerWithIdentifier:
)。我在这里解释如何做到这一点:http://www.apeth.com/iOSBook/ch19.html#SECsivc
关于objective-c - 用pushViewController替换Storyboard Segue会导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9528077/