Swift: UITableView 未加载数据
Swift: UITableView not loading data
我有两个视图控制器 FirstViewController
和 SecondViewController
。 SecondViewController
是一个带有 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 声明
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
的数据,但是,数据不会加载。我检查了错误并且数据正在从委托中传递。任何帮助将不胜感激。
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 行 - 此行需要作为转场 destinationViewController
的实例。
第 3 行 = 这行您再次创建了另一个不需要的实例。您正在此实例上设置 calculations array
。 segue 在另一个实例上工作。这就是为什么您没有在第二个视图控制器中获取数组的原因。
以下代码应该可以工作。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var secondVC = segue.destinationViewController as SecondViewController()
secondVC.calculations(wage.allCalculations)
}
我不明白为什么你需要一个委托和一个协议来设置计算数组。只需在 SecondViewController 中定义 calculations
函数即可。
我有两个视图控制器 FirstViewController
和 SecondViewController
。 SecondViewController
是一个带有 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
的数据,但是,数据不会加载。我检查了错误并且数据正在从委托中传递。任何帮助将不胜感激。
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 行 - 此行需要作为转场 destinationViewController
的实例。
第 3 行 = 这行您再次创建了另一个不需要的实例。您正在此实例上设置 calculations array
。 segue 在另一个实例上工作。这就是为什么您没有在第二个视图控制器中获取数组的原因。
以下代码应该可以工作。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var secondVC = segue.destinationViewController as SecondViewController()
secondVC.calculations(wage.allCalculations)
}
我不明白为什么你需要一个委托和一个协议来设置计算数组。只需在 SecondViewController 中定义 calculations
函数即可。