详细视图 UITableView - 在 segue 之前传递数据

Posted

技术标签:

【中文标题】详细视图 UITableView - 在 segue 之前传递数据【英文标题】:Detail View UITableView - Pass data before segue 【发布时间】:2014-12-18 03:54:43 【问题描述】:

所以在我的故事板文件中,我有一个从一个 UITableViewController 转到另一个的 segue,这样当用户点击单元格时,它会打开下一个表格。没什么特别的。但是当他们点击单元格时,我需要指定要加载到下一个视图中的数据。我在 didSelectRowAtIndexPath 中执行此操作。根据 indexPath.row,我在 prepareForSegue 函数中设置分配给详细表视图的变量的值。我将视图控制器加载为let detailViewController = segue.destinationViewController as DetailTableViewController 中的变量。从这里使用分配功能设置数据。但是,当我点击表格时,数据不会显示,直到我按下并再次点击它。基本上数据是在 segue 之后分配的......我如何分配数据并在之后执行 segue?

编辑

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
        switch indexPath.row 
        case 0:
            self.passedInfo = self.infoOne;
            break
        case 1:
            self.passedInfo = self.infoTwo;
            break
        case 2:
            self.passedInfo = self.infoThree;
            break
        default:
            break;
        
    

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
        let detailViewController = segue.destinationViewController as DetailTableViewController
        let destinationTitle = "Detail View"
        detailViewController.title = destinationTitle
        self.passedScores.sort$0 > $1;
        detailViewController.setData(self.passedInfo);
    

【问题讨论】:

***.com/questions/26846804/…的可能重复 【参考方案1】:

您应该在控制器显示之前使用prepareForSegue 函数将数据传递给目标视图控制器。这是一篇关于如何在 Swift 中执行此操作的精彩文章:http://www.raywenderlich.com/forums/viewtopic.php?f=11&t=18471

【讨论】:

【参考方案2】:

只需使用 prepareForSegue 完成此任务

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
 // Get the new view controller using segue.destinationViewController.
 // Pass the selected object to the new view controller.

 if segue.identifier == "mysegue" 
  let vc = segue.destinationViewController as? DetailTableViewController
  if let indexPath = self.tableView.indexPathForSelectedRow 
    switch indexPath.row 
        case 0:
            self.passedInfo = self.infoOne;
            break
        case 1:
            self.passedInfo = self.infoTwo;
            break
        case 2:
            self.passedInfo = self.infoThree;
                break
        default:
            break;
    
    vc.setData(self.passedInfo);
  
 

【讨论】:

我也会看看发件人。奇怪的是它是选定的表格单元格(或可能是子视图)。如果是这样,您可以从单元格中获取索引路径,并且不那么麻烦。【参考方案3】:

不要分配给 didSelectRowatIndexPath 中的变量,而是检查 prepareForSegue 方法中的选定行。

【讨论】:

【参考方案4】:

我的错误是控制从 tableview 中的单元格而不是从视图控制器本身拖动。当我移动 segue 并从 didSelectRowatIndexPath 手动调用它时,它工作正常

【讨论】:

【参考方案5】:

您应该在didSelectRowAtIndexPath 中调用函数performSegueWithIdentifier。这将首先设置变量,然后调用 segue。方法如下:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    switch indexPath.row 
    case 0:
        self.passedInfo = self.infoOne;
        break
    case 1:
        self.passedInfo = self.infoTwo;
        break
    case 2:
        self.passedInfo = self.infoThree;
        break
    default:
        break;
    

   self.performSegueWithIdentifier("ShowInfo", sender: self)


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
    if segue.identifier = "ShowInfo" 
    let detailViewController = segue.destinationViewController as DetailTableViewController
    let destinationTitle = "Detail View"
    detailViewController.title = destinationTitle
    self.passedScores.sort$0 > $1;
    detailViewController.setData(self.passedInfo);
    

确保在情节提要中为 segue 提供标识符。

希望这会有所帮助。 :)

【讨论】:

以上是关于详细视图 UITableView - 在 segue 之前传递数据的主要内容,如果未能解决你的问题,请参考以下文章

UITableView推送segue多次触发

带有详细信息的 UITableView 清单(防止 Segue?)

Segue导致黑屏

使用原型单元执行 segue [重复]

双击 UITableview 中的单元格以执行 segue

UITableview 根据所选单元格显示不同的数据