【问题标题】:Replacing Storyboard Segue with pushViewController causes strange behaviour用 pushViewController 替换 Storyboard Segue 会导致奇怪的行为
【发布时间】:2012-03-20 15:33:21
【问题描述】:

我这辈子似乎无法弄清楚这一点。我有一个自定义表格视图单元格,在该单元格中我配置了一些按钮。每个按钮都通过故事板 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...

有什么建议吗?

【问题讨论】:

    标签: objective-c ios uiviewcontroller storyboard segue


    【解决方案1】:

    欢迎来到现实世界。以前,故事板是一个拐杖;你对自己隐藏了关于视图控制器如何工作的真实事实。现在你正试图扔掉那个拐杖。好的!但现在你必须学会​​走路。 :) 这里的关键是这一行:

    SpotDetails *spotDetails = [[SpotDetails alloc] init];
    

    SpotDetails 是 UIViewController 的子类。你在这里没有做任何会导致这个 UIViewController 有视图的事情。因此,您最终会得到一个空白的通用视图!如果你想让 UIViewController 有一个视图,你需要以某种方式它一个视图。例如,您可以在名为 SpotDetails.xib 的 nib 中绘制视图,其中文件的所有者是 SpotDetails 实例。或者,您可以在覆盖viewDidLoad 的代码中构造视图的内容。详细信息在 UIViewController 文档中,或者,更好的是,阅读我的书,它告诉你所有关于视图控制器如何获取它的视图:

    http://www.apeth.com/iOSBook/ch19.html

    之前没有出现此问题的原因是您在与视图控制器相同的 nib 中绘制视图(即情节提要文件)。但是,当您分配初始化 SpotDetails 时,它与情节提要文件中的实例不同,因此您无法获得该视图。因此,一种解决方案可能是加载情节提要并获取 那个 SpotDetails 实例,即情节提要中的实例(通过调用instantiateViewControllerWithIdentifier:)。我在这里解释如何做到这一点:

    http://www.apeth.com/iOSBook/ch19.html#SECsivc

    【讨论】:

    • 哇,马特,非常感谢!我现在正在看你的书并学习走路 =)
    • 酷,谢谢。我希望我已经正确地确定了问题的根源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2018-09-16
    相关资源
    最近更新 更多