通过didselectrowatindexpath将数据发送到新的视图控制器

时间:2016-01-26 18:39:57

标签: swift

我在一个视图控制器中设置了一个tableview,我正在尝试将indexPath.row文本发送到新的视图控制器的标签。我收到一个错误,说明在打开一个可选值时它找到了nil。如果我在下面显示的viewController代码中打印“selectedClass”,我会得到indexPath.row的文本。如果我在新的viewController中打印文本,我什么也得不到。这是我的代码:

覆盖func tableView(tableView:UITableView,didSelectRowAtIndexPath indexPath:NSIndexPath){

    let classIndexPath = tableView.indexPathForSelectedRow!

    let selectedCell = tableView.cellForRowAtIndexPath(classIndexPath)! as UITableViewCell


    let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
    spinningActivity.labelText = "Just a Moment"

    if reachabilityStatus == kNOTREACHABLE {

        spinningActivity.hide(true)

        self.displayAlert("No Internet Connection", message: "Please connect to the internet before continuing.")


    } else {

        spinningActivity.hide(true)

        let selectedClass = selectedCell.textLabel!.text!

        let newCardSetVC = self.storyboard?.instantiateViewControllerWithIdentifier("NewCardSetViewController") as! NewCardSetViewController

        newCardSetVC.selectedClassLabel.text = selectedClass as String



        self.performSegueWithIdentifier("addCardSetSegue", sender: self)


    }

}

3 个答案:

答案 0 :(得分:0)

尝试这样的事情:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let classIndexPath = tableView.indexPathForSelectedRow!
    let selectedCell = tableView.cellForRowAtIndexPath(classIndexPath)! as UITableViewCell
    let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
    spinningActivity.labelText = "Just a Moment"
    if reachabilityStatus == kNOTREACHABLE {
        spinningActivity.hide(true)
        self.displayAlert("No Internet Connection", message: "Please connect to the internet before continuing.")

    } else {
        spinningActivity.hide(true)
        self.performSegueWithIdentifier("addCardSetSegue", sender: self)
    }
}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "addCardSetSegue"{
        if let indexPath = tableView!.indexPathForSelectedRow as NSIndexPath?{
             let selectedCell = tableView?.cellForRowAtIndexPath(indexPath)
             let selectedClass = selectedCell.textLabel!.text!
             let vc = segue.destinationViewController as! NewCardSetViewController
             vc.selectedClassLabel.text = selectedClass as String
        }
    }
}

所以当你performSegueWithIdentifier创建一个实例时,如果那个VC并没有使用你在didSelectRowAtIndexPath中创建的实例。因此,解决方案是使用performSegue创建的实例。这是通过在segue.destinationViewController中调用prepareForSegue来完成的。

备用解决方案可能无法调用performSegueWithIdentifier而是调用self.presentViewController(newCardSetVC, animated: true, completion: nil)之类的内容,而不是我在评论中所说的。

希望这有帮助,如果您有任何问题,请与我联系。

答案 1 :(得分:0)

也许是这样的......

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "segID" {

    let navigationController = segue.destinationViewController as! UINavigationController
    let controller = navigationController.topViewController as! NewCardSetViewController
    let selectedCell = tableView.cellForRowAtIndexPath(indexPathForSelectedRow)! as UITableViewCell
    let selectedClass = selectedCell.textLabel!.text!
    newCardSetVC.selectedClassLabel.text = selectedClass as String
        }
  }

你可以使用
self.performSegueWithIdentifier("addCardSetSegue", sender: self)

didSelectRowAtindexPath

如果你的NewCardSetViewController没有嵌入导航控制器中,你可以跳过上面的其中一行并直接使用...

let controller = segue.destinationViewController as! NewCardSetViewController

答案 2 :(得分:0)

您正尝试在NewCardSetViewController标签中设置字符串值。

NewCardSetViewController只会在执行segue后加载到内存中。 因此,NewCardSetViewController的viewDidLoad()将在segue之后调用。

在您的代码中,您尝试在segue执行之前设置值。 要在nextViewController中传递data,您需要创建具有您尝试传递的相同数据类型的变量。

在您的情况下,在NewCardSetViewController中创建字符串变量strSelectedClass,而不是直接将值设置为标签,设置该变量的值,即strSelectedClass

替换

newCardSetVC.selectedClassLabel.text = selectedClass as String

newCardSetVC.strSelectedClass = selectedClass as String

viewDidLoad: NewCardSetViewController下面的行中,它会在您的标签上显示值。

self.selectedClassLabel.text = self.strSelectedClass

你已经创建了对象,因此NewCardSetViewController的所有变量都将获得内存,但IBOutlet不会。

IBOutlet只会在执行segue或pushViewController后获取内存。