【问题标题】:Swift: variable gets value assigned in the wrong orderSwift:变量以错误的顺序获取值
【发布时间】:2019-03-10 19:59:28
【问题描述】:

我可能在这里遗漏了一些基本的东西,但我有两个 ViewControllers,分别称为 ListController(starting VC) 和 ExamplesController,还有一个名为 selectedCell 的变量,它在 ListController 中声明,然后它的值在ListController tableView didSelectRowAt indexPath 函数基于用户点击的行。当用户点击一个单元格时,将显示ExamplesController(通过 IB 中的 segue),但在我返回 ListController 之前,selectedCell 的值不会改变。所以现在执行的顺序是:

selectedCell 被初始化为 0

用户点击一个单元格(比如说索引 3)

ExamplesController 显示标题 0

用户返回ListController

selectedCell 被赋值为 3

这是代码的简化版本。

var selectedCell = 0

class ListController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedCell = indexPath.row
        print("Tapped on \(selectedCell)")
    }

}


class ExamplesController: UIViewController{

    @IBOutlet weak var chapterTitle: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()        
        chapterTitle.text = "\(chapterTitles[selectedCell])"
    }

}

任何想法我做错了什么?

【问题讨论】:

  • 嗨,罗伯特,我正在 IB 通过 segue 执行此操作:ibb.co/9T1djy0
  • 如果在 IB 中设置了 ExamplesController 的 segue,那么在调用委托的 didSelectRowAt 方法之前就会触发它,这就是导致您的问题的原因。最好是创建 segue 然后在 'didSelectRowAt' 方法中调用它,或者保留在 IB 中定义的 segue 并在视图控制器上使用 prepare 方法,该方法在第二个视图控制器出现之前执行.
  • 我明白了,感谢您的澄清。我已经尝试从 didSelectRow 函数内部展示 VC,并且成功了。

标签: ios swift variables variable-assignment


【解决方案1】:

您需要从 vc 本身而不是单元格中挂钩 segue,并在 didSelectRowAt 内部使用

self.performSegue(withIdentifer:"SegueName",sender:indexPath.row)

func prepare(for segue: UIStoryboardSegue,sender: Any?)  {  
  if segue.identider == "SegueName"  {
     let des = segue.destination as! ExampleVC
     des.selectedCell = sender as! Int
  }
}

【讨论】:

  • 非常感谢。 Uploader Of Truth 的解释 + 你的解决方案帮我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2019-07-04
  • 1970-01-01
  • 2015-09-23
  • 2018-06-30
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多