我试图将viewController A中的一个表格中的数据发送到viewController B.但是每当我尝试时,我都会收到错误消息Unexpectedly found nil
。
我将所有数据都放在一个被调用并写入表格单元格的数据类数组中,然后我有一个segue应该将selectedCell
数据传递给第二个viewController中的var调用cellData
if segue.identifier == "viewMemorySegue" {
let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController
viewMemoryVC.cellData = selectedCell!
}
然后我有一个didSelectRow
函数设置selectedCell
数据,然后设置performing segue
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
selectedCell = cacheData[indexPath.row]
tableView.deselectRowAtIndexPath(indexPath, animated: true)
performSegueWithIdentifier("viewMemorySegue", sender: self)
}
我已经在print(cellData.memoryTitle)
函数中累了didSelect
以查看它是否为零,但它打印出正确的数据。
我是Xcode和swift的新手所以非常感谢所有的帮助!!!
GITHub Project Link https://github.com/Matthammond96/Relive
答案 0 :(得分:3)
您的故事板中有一个选择segue集,设置为打开MemoryViewerViewController
,我在FindCacheViewController
中看不到代理集,因此您的didSelectRowAtIndexPath
功能不在因此,...未设置selectedCell
属性。
我会删除你的故事板segue,正确设置你的委托,然后它应该工作。
我在didSelectRowAtIndexPath中添加了一个打印输出,但从未调用过。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("TEST")
selectedCell = cacheData[indexPath.row]
tableView.deselectRowAtIndexPath(indexPath, animated: true)
//performSegueWithIdentifier("viewMemorySegue", sender: self)
}
正如您将注意到的那样,我还注释了performSegueWithIdentifier
方法调用,并且segue仍然试图从您的故事板中发生。
答案 1 :(得分:1)
如果您的数据是全局数据,则不必在VC B中声明它,如果它在VC A中是本地数据,则必须在VC B中声明它。然后在VC B中创建var selectedIndexPath: NSIndexPath?
。然后在VC A中创建var selectedIndexPath: NSIndexPath?
。然后在didSelectRowAtIndexPath
函数中,将选定的索引路径发送到selectedIndexPath
,如tableView.indexPathForCell(cellFromDelegateMethod)
然后
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "viewMemorySegue" {
let viewMemoryVC = segue.destinationViewController as! memoryViewierViewController
viewMemoryVC.selectedIndexPath = selectedIndexPath!
}
}
答案 2 :(得分:0)
请考虑以下代码:
带有表格视图的第一个视图控制器:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
private var cellData: String!
//MARK - TableViewDatasource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")
cell?.textLabel?.text = "data \(indexPath.row)"
return cell!
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
let cell: UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
self.cellData = cell.textLabel?.text
performSegueWithIdentifier("AnotherViewControllerSegue", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let destinationVC : AnotherViewController = segue.destinationViewController as! AnotherViewController
destinationVC.data = self.cellData;
}
}
接下来,另一个具有保存数据属性的View Controller
class AnotherViewController: UIViewController {
var data:NSString!
override func viewDidLoad() {
super.viewDidLoad()
NSLog(self.data as String)
}
}