首页 文章

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

提问于
浏览
1

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


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)

        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

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

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

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

    在你的情况下,在_904674中创建字符串变量_比如 strSelectedClass ,而不是直接将值设置为label,设置该变量的值,即 strSelectedClass .

    Replace line

    newCardSetVC.selectedClassLabel.text = selectedClass as String
    

    with

    newCardSetVC.strSelectedClass = selectedClass as String
    

    In viewDidLoad: of NewCardSetViewController put below line, it will display value onto your label.

    self.selectedClassLabel.text = self.strSelectedClass
    

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

    IBOutlet will only get memory after segue perform or pushViewController.

  • 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创建的实例 . 这是通过在 prepareForSegue 中调用 segue.destinationViewController 来完成的 .

    替代解决方案可能不是调用 performSegueWithIdentifier 而是调用 self.presentViewController(newCardSetVC, animated: true, completion: nil) 之类的东西,而不是我在评论中所说的 .

    希望这有帮助,如果您有任何疑问,请告诉我 .

  • 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

相关问题