UITable DidSelectRowAtIndexPath不通过segue发送数据(意外发现为零)

时间:2015-12-31 14:10:53

标签: ios swift uitableview swift2 segue

我试图将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

3 个答案:

答案 0 :(得分:3)

您的故事板中有一个选择segue集,设置为打开MemoryViewerViewController,我在FindCacheViewController中看不到代理集,因此您的didSelectRowAtIndexPath功能不在因此,...未设置selectedCell属性。

enter image description here

我会删除你的故事板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)
    }
}