我在一个视图控制器中设置了一个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)
}
}
答案 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后获取内存。