【问题标题】:UITableView delegate methods being called before viewDidLoad()在 viewDidLoad() 之前调用 UITableView 委托方法
【发布时间】:2017-10-03 16:38:14
【问题描述】:

UIViewControllerviewDidLoad() 中有一个方法被调用来更新一个类变量。一旦我导航到另一个视图控制器并返回到这个视图控制器,UITableView 的委托方法将首先在使用该类变量的地方被调用。应用程序正在崩溃,因为该变量是在 viewDidLoad() 中构造的。如何解决这个问题?谢谢。

有问题的类变量:

var showHideDict = Dictionary<Int, Bool>()

viewDidLoad():

override func viewWillAppear() {
    super.viewWillAppear()
    makeAPICall()
}

API调用方式:

func makeAPICall() {
    // create helper object
    let helper = ModelHelper()
    helper.createModels(receivedDict: result! as NSDictionary)

            // store the showHideDict
    for index in 0...(Modelclass.models.count - 1) {
        self.showHideDict[index] = true
    }

    DispatchQueue.main.async {
         self.tableView.reloadData()
    }
}

【问题讨论】:

  • 通过发布代码而不是在句子中解释您的代码。到目前为止,这听起来应该是开箱即用的,或者是 stackoverflow.com/questions/46521391/xcode-swift-viewdidload 的副本
  • 添加代码而不是解释。感谢您的回复。
  • 你为什么打电话给viewWillAppear()?不应该是super.viewWillAppear()吗?
  • 改变了它。谢谢!
  • 在init()中构造变量

标签: ios swift uitableview viewdidload


【解决方案1】:

在您的UITableViewDelegate 方法中,我认为您需要检查字典中的数据是否按预期填充。例如,这是我在代码中经常做的事情:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{
    return tableData?.count ?? 0
}

也就是说:如果tableData 不为零,则返回数组中元素的数量。否则返回 0

然后在您的cellForRowAt 方法中,只需有条件地检查您的showHideDict 中的数据是否按照您的预期填充,如果不是,请不要强制解包。 Swift 使用可选项来强制执行安全性...使用它而不是反对它。

一旦您的 API 调用完成,您只需执行tableView.reloadData(),表格视图就会使用您新填充的数据构建。

【讨论】:

  • 这个解决方案非常适合我!早些时候我没有检查是否收到了 API 数据。正如您在回答中正确指出的那样,关键是在numberOfRowsInSection 中检查它并在cellForRow 中重新加载表数据。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多