我在一个视图控制器中设置了一个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 回答
您正尝试在
NewCardSetViewController
的标签中设置字符串值 .NewCardSetViewController
只会在执行segue后加载到内存中 . 因此,NewCardSetViewController
的viewDidLoad()将在segue之后调用 .在您的代码中,您尝试在segue执行之前设置值 . 要在nextViewController中传递data,您需要使用您尝试传递的相同数据类型的数据创建变量 .
在你的情况下,在_904674中创建字符串变量_比如
strSelectedClass
,而不是直接将值设置为label,设置该变量的值,即strSelectedClass
.Replace line
with
In viewDidLoad: of NewCardSetViewController put below line, it will display value onto your label.
你已经创建了对象,所以
NewCardSetViewController
的所有变量都将获得内存,但IBOutlet不会 .IBOutlet will only get memory after segue perform or pushViewController.
尝试这样的事情:
所以当你
performSegueWithIdentifier
你正在创建一个实例,如果那个VC并没有使用你在didSelectRowAtIndexPath中创建的实例 . 因此,解决方案是使用performSegue创建的实例 . 这是通过在prepareForSegue
中调用segue.destinationViewController
来完成的 .替代解决方案可能不是调用
performSegueWithIdentifier
而是调用self.presentViewController(newCardSetVC, animated: true, completion: nil)
之类的东西,而不是我在评论中所说的 .希望这有帮助,如果您有任何疑问,请告诉我 .
也许是这样的......
你可以使用
self.performSegueWithIdentifier("addCardSetSegue", sender: self)
在你的
didSelectRowAtindexPath
如果您的
NewCardSetViewController
未嵌入导航控制器中,您可以跳过上面的其中一行并直接使用...let controller = segue.destinationViewController as! NewCardSetViewController