Swift中VC之间的短期记忆

时间:2015-11-30 17:39:08

标签: ios swift segue tableviewcell

简短版本为:

在模式演示和解雇另一个VC期间,VC变量的值是否保持一致?当第二个VC被解雇时,原始VC的变量是否仍然等于它们的最后值?

详细信息,如果需要

我有一个viewController,其中选择了一个表格单元格。然后将该单元格的内容拉出并传递给编辑器viewController,如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    //Segue to mainVC editor, for editing action
    if (segue.identifier == "modalToEditor") && passingEdit == true {
        //Assign selection to a variable 'currentCell'
        let indexPath = tableView.indexPathForSelectedRow;
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! CustomTableViewCell;

        //Set cell text into variables to pass to editor
        let cellNameForEdit = currentCell.nameLabel!.text
        let cellDescForEdit = currentCell.descLabel.text

        //Pass values to EditorView
        let editorVC = segue.destinationViewController as! EditorView;
        editorVC.namePassed = cellNameForEdit
        editorVC.descPassed = cellDescForEdit
        editorVC.indexOfTap = indexPath
        editorVC.currentListEntity = currentListEntity

现在,在第二个/编辑器viewController中,用户可以点击要求移动单元格的按钮。 "移动屏幕"是一个不同的/第三个VC。我想知道的是,我可以解雇编辑器并期望原始VC记住最后选择的单元格吗?

  • 如果它会记住,那么我假设我可以将它传递给第三个/移动VC。
  • 如果原始的VC单元格变量仍然不能容纳最后一个单元格,那么我必须想办法让它记住!全局变量可能?

附加编辑以显示cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //Setup variables
    let cellIdentifier = "BasicCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomTableViewCell

    //Make sure the row heights adjust properly
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 80.0


    //Create normal cells except when last cell
    if indexPath.row < taskList_Cntxt.count {
        let task =  taskList_Cntxt[indexPath.row]
        //Create table cell with values from Core Data attribute lists
        cell.nameLabel!.text = task.valueForKey("name") as? String
        cell.descLabel!.text = task.valueForKey("desc") as? String

        //Related to running TaskActions: Empty block function passed from custom cell VC
        cell.doWork = {
            () -> Void in
            self.doStuff(cell)
        }
    }

2 个答案:

答案 0 :(得分:1)

是。视图控制器只是对象,因为只有在执行更改它们的代码时才更改它们的属性。在您的特定情况下,VC将其表视图保持为属性(并且强烈地作为其视图的子视图),并且表视图保留所选索引路径的数组。但是要小心,UITableViewController的子类可以在viewWillAppear(see here)上默认清除选择。

另请注意,您已经选择了大多数人认为在editorVC中初始化prepareForSegue的奇怪方法。获取选定的索引路径很好,但随后获取单元格(视图),然后配置该单元格,然后从单元格的子视图中获取数据源值非常迂回。

查看let task = taskList_Cntxt[indexPath.row]方法中的cellForRowAtIndexPath行?这就是您在给定indexPath访问数据源数组中的对象的方法。该对象(您称之为task)应该传递给下游视图控制器。

答案 1 :(得分:1)

乍一看你的应用程序有奇怪的用户体验:)

回答你的问题:

1)从你的描述看来,第一个视图控制器似乎仍在执行,因此它的所有属性都保存在内存中,因此你可以在属性中存储选定的indexPath

2)您可以使用选定的indexPath配置第三个视图控制器,在解除之前从第二个开始,或者在第二个vc被关闭后从第一个开始配置,具体取决于您的导航

3)为此目的,全局变量是不好的做法