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