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

Swift 通过didselectrowatindexpath将数据发送到新的视图控制器,swift,Swift,我在一个视图控制器中设置了一个tableview,我正在尝试将indexPath.row文本发送到一个新视图控制器的标签。我得到一个错误,说它发现零时,展开一个可选值。如果在如下所示的viewController代码中打印“selectedClass”,则会得到indexPath.row的文本。如果我在新的viewController中打印文本,我将一无所获。这是我的密码: 重写func tableView(tableView:UITableView,didSelectRowAtIndexPa

我在一个视图控制器中设置了一个tableview,我正在尝试将indexPath.row文本发送到一个新视图控制器的标签。我得到一个错误,说它发现零时,展开一个可选值。如果在如下所示的viewController代码中打印“selectedClass”,则会得到indexPath.row的文本。如果我在新的viewController中打印文本,我将一无所获。这是我的密码:


重写func tableView(tableView:UITableView,didSelectRowAtIndexPath:nsindepath){



试试这样的方法:

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
        }
    }
}
因此,当您
performsguewithidentifier
时,您正在创建一个实例,而不是使用您在didSelectRowAtIndexPath中创建的实例。因此,解决方案是使用由performsgue创建的实例。这是通过在
prepareforsgue
中调用
segue.destinationViewController
完成的


另一种解决方案可能不是调用
performsguewithidentifier
,而是调用类似于
self.presentViewController(newCardSetVC,animated:true,completion:nil)
,而是如我在注释中所述


希望这对您有所帮助,如果您有任何问题,请告诉我。

尝试以下方法:

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
        }
    }
}
因此,当您
performsguewithidentifier
时,您正在创建一个实例,而不是使用您在didSelectRowAtIndexPath中创建的实例。因此,解决方案是使用由performsgue创建的实例。这是通过在
prepareforsgue
中调用
segue.destinationViewController
完成的


另一种解决方案可能不是调用
performsguewithidentifier
,而是调用类似于
self.presentViewController(newCardSetVC,animated:true,completion:nil)
,而是如我在注释中所述


希望这有帮助,如果你有任何问题,请告诉我。

也许是这样的

 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.performsguewithidentifier(“addCardSetSegue”,发件人:self)

在您的
did中选择rowatindexpath

如果您的
NewCardSetViewController
未嵌入导航控制器,您可以跳过上面的一行,直接使用


let controller=segue.destinationViewController as!NewCardSetViewController

可能是这样的

 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.performsguewithidentifier(“addCardSetSegue”,发件人:self)

在您的
did中选择rowatindexpath

如果您的
NewCardSetViewController
未嵌入导航控制器,您可以跳过上面的一行,直接使用


let controller=segue.destinationViewController as!NewCardSetViewController
您正在尝试在
NewCardSetViewController
的标签中设置字符串值

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

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

在您的例子中,在
NewCardSetViewController
中创建字符串变量,比如说
strSelectedClass
,而不是直接将值设置为label,而是设置该变量的值,即
strSelectedClass

替换行

newCardSetVC.selectedClassLabel.text = selectedClass as String
newCardSetVC.strSelectedClass = selectedClass as String

newCardSetVC.selectedClassLabel.text = selectedClass as String
newCardSetVC.strSelectedClass = selectedClass as String
viewdiload:
NewCardSetViewController
的下面一行,它将在标签上显示值。

self.selectedClassLabel.text = self.strSelectedClass
您已经创建了对象,所以
NewCardSetViewController
的所有变量都将获得内存,但IBOutlet不会


IBOutlet仅在继续执行或按下ViewController之后才能获得内存。

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

self.selectedClassLabel.text = self.strSelectedClass
NewCardSetViewController
仅在执行segue后加载到内存中。 因此,
NewCardSetViewController
的viewDidLoad()将在segue之后调用

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

在您的例子中,在
NewCardSetViewController
中创建字符串变量,比如说
strSelectedClass
,而不是直接将值设置为label,而是设置该变量的值,即
strSelectedClass

替换行

newCardSetVC.selectedClassLabel.text = selectedClass as String
newCardSetVC.strSelectedClass = selectedClass as String

newCardSetVC.selectedClassLabel.text = selectedClass as String
newCardSetVC.strSelectedClass = selectedClass as String
viewdiload:
NewCardSetViewController
的下面一行,它将在标签上显示值。

self.selectedClassLabel.text = self.strSelectedClass
您已经创建了对象,所以
NewCardSetViewController
的所有变量都将获得内存,但IBOutlet不会


IBOutlet只有在segue perform或pushViewController之后才能获得内存。

您正在创建一个新的
NewCardSetViewController的实例,并同时使用一个
segue
。这真的是您想要的吗?Eendje说的。您没有使用您创建的newCardSetVC实例?
self.presentViewController(newCardSetVC,动画:true,完成:nil)
您也可以调用
performsguewithidentifier
,然后在
prepareforsgue
中执行将所选类值传递给VCO的所有逻辑。您可能不应该这样做,在这里您创建了
NewCardSetVC
的新实例,还可以使用
segue
。这可能就是您出现此问题的原因。请尝试使用g使用
prepareforsgue
方法传递所需的文本信息您正在创建
NewCardSetViewController
的新实例,并同时使用
segue
。这真的是您想要的吗?Eendje说的。您没有使用新卡
self.selectedClassLabel.text = self.strSelectedClass