Swift:UITableView无法加载数据

时间:2015-01-12 15:18:56

标签: ios uitableview swift delegates

我有两个视图控制器FirstViewControllerSecondViewControllerSecondViewController是一个普通的视图控制器,上面有UITableView

FirstViewController我呼叫第二个出现。当我调用它时,我想通过委托传递数据。 代表协议如下:

protocol CalculationDelegate{
    func calculations(calculation: [Double])
}

基本上它传递了一系列双打。在FirstViewController上点击A按钮时,我使用prepareForSegue为转换做好准备并设置代理。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var secondVC = SecondViewController()
    secondVC = segue.destinationViewController as SecondViewController

    // Set up the delegation, so data is passed to SecondViewController
    self.delegate = SecondViewController()
    self.delegate?.calculations(wage.allCalculations)
}

现在在SecondViewController我想要访问我刚刚传递的数据,以便加载到UITableView。 以下是SecondViewController

的完整类声明
class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CalculationDelegate {

    @IBOutlet
    var tableView: UITableView!
    var calculations: [Double] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }

    // Conform to CalculationsDelegate by implementing this method
    func calculations(calculation: [Double]) {
        self.calculations = calculation

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.calculations.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

        cell.textLabel?.text = NSString(format: "%.2f", self.calculations[indexPath.row])
        return cell
    }

}

如您所见,我正在尝试在委托方法中分配self.calculations = calculation。然后使用它作为加载UITableView的数据,但是,数据将不会加载。我检查了错误,数据正从委托传递。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

SecondViewController()实际上构造了一个新的视图控制器实例。让我们看看你的代码。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var secondVC = SecondViewController() // Line 1
    secondVC = segue.destinationViewController as SecondViewController()  // Line 2

    // Set up the delegation, so data is passed to SecondViewController()
    self.delegate = SecondViewController()  // Line 3
    self.delegate?.calculations(wage.allCalculations)
}

看看Line1。您正在secondVC中创建SecondViewController的新实例,这不是必需的。

第2行 - 此行需要获取segue destinationViewController的实例。

第3行=此行再次创建另一个不需要的实例。您正在此实例上设置calculations array。 segue适用于另一个实例。这就是为什么你不在第二个视图控制器中获取数组的原因。

以下代码应该有效。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var secondVC = segue.destinationViewController as SecondViewController()

    secondVC.calculations(wage.allCalculations)
}

我不明白为什么你需要一个委托和一个协议来设置计算数组。只需在SecondViewController中定义calculations函数即可。