【问题标题】:Segue to a new version of the current view controller转到当前视图控制器的新版本
【发布时间】:2016-04-06 20:12:25
【问题描述】:

在流行的应用程序 Instagram 中,当您点击用户时,它会显示他们的个人资料。如果您单击另一个用户名(可能是在照片上的评论中),那么它会显示第二个人的个人资料。

我正在尝试使用 Objective-C 和 Storyboard 来实现类似的目标。我有你可以考虑的帐户页面,并且在该页面中是其他用户。我可以访问一个帐户页面,但在获取您在 Instagram 等应用程序中看到的无穷无尽的帐户页面时遇到了麻烦,原因之一是您无法对同一个视图控制器执行 segue。当您从帐户页面中单击新用户时,我试图通过以编程方式显示新帐户页面来解决此问题,但我遇到了很多错误。

有什么方法可以实现相同视图控制器的无穷无尽的流(显然我使用的是navigationController,因为这可能会被问到我)。

编辑使用@tmac_balla 提供的解决方案(感谢您的帮助)我可以继续使用新的tableview,但tableView 是空白的,我收到以下错误消息。

*** Assertion failure in -[UITableView     _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-  3512.30.14/UITableView.m:7962
2016-01-02 17:06:46.765 Quoter[1631:845864] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x146096000; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x1456c19b0>; layer = <CALayer: 0x1456c0330>; contentOffset: {0, -64}; contentSize: {320, 400}>) failed to obtain a cell from its dataSource (<_UIFilteredDataSource: 0x145727b20>)'

EDIT 2 使用@Daniel T 提供的解决方案。我能够将新的视图控制器推送到导航堆栈上,并且控制器的非tableView 部分工作正常,但是当它出现时对于tableView 中的单元格,我(在我的简短测试中)看到了这样一种情况,即单元格没有出现在新的tableView 上,而是出现在前一个上。不确定这是否只是我加载单元格的方式或解决方案的问题。

【问题讨论】:

    标签: ios objective-c iphone storyboard uistoryboardsegue


    【解决方案1】:

    只需对同一个视图控制器进行转场。这是一个按钮的示例,该按钮连接到它所在的视图控制器(另一个副本)。

    【讨论】:

    • 所以它正在推送到新的视图控制器并且视图控制器是可见的。但是有一个相当奇怪的错误。有时,新的视图控制器上没有任何单元格出现,而是出现在前一个视图控制器上。有什么帮助吗? @Daniel T.
    • 一个新的视图控制器意味着一组新的单元格。确保正确初始化它们。
    【解决方案2】:

    当点击链接/按钮时,您需要做的是将视图控制器推送到您的 UINavigationController 中,而不是使用 segues。所以当你的方法被调用时,你写

    accountViewController account = accountViewController()
    account.someTextField.text = "someText"
    self.navigationController.pushViewController(account, animated: YES);
    

    创建同一 VC 的新实例并将其推送到屏幕。

    关于错误,尝试检查单元格是否存在,如果不存在则初始化

        var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
    
        if (cell == nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
        }
     }
    

    【讨论】:

    • 但是我如何在 prepareForSegue 中使用 segue,因为我无法在 storyboard @tmac_balla 中使用同一个视图控制器
    • @bretf 你不需要继续相同的视图。故事板只是告诉你在一个视图控制器和另一个视图控制器之间存在一个 segue。但实际上,您在需要时为每个帐户创建一个新的 accountVC 实例(单击链接)。然后使用 UINavigationBar 中的后退按钮返回上一个帐户。
    • @bretf 哦,我明白了。没关系,你应该做的就是将 VC 推入导航控制器。编辑了答案
    • 我尝试了你的方法(类似于我尝试过的一些修改),但我收到了一条错误消息。该消息已添加到我的问题@tmac_balla
    • @bretf 好的,所以你应该像使用前一个一样初始化新的 VC。如果你确定你做对了,他们会先检查单元格以确保它存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2016-11-27
    • 2017-12-18
    • 2012-11-07
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多