Swift - Unwind segue 传回 nil 值?
Swift - Unwind segue passes back nil value?
我有两个视图控制器。第二个视图控制器托管一个 table 视图,其中包含一个自定义单元格,该单元格展开回第一个视图控制器并发回与该单元格关联的数据。
在第二个视图控制器 class 中,我实现了 didSelectRowAtIndexPath 并进行了测试以查看 class 属性 中是否存储了正确的项目。它正确地存储了可选值,但是当我尝试在第一个视图控制器中使用该值时,属性 将 nil 打印到控制台。
// First view controller
@IBAction func unwindActivitiesVCCellTapped( segue: UIStoryboardSegue )
{
// table view cell tapped
guard let activitiesVC = segue.sourceViewController as? ActivitiesVC else { return }
print(activitiesVC.activityPerforming) // Displays nil in console output
if let activityPerforming = activitiesVC.activityPerforming // thus this does not get called
{
activityPerformingButton.titleLabel?.text = activityPerforming
}
}
// Second View Controller
class ActivitiesVC: UIViewController
{
@IBOutlet weak var activitiesTableView: UITableView!
let activityTitles = [ "Walk" , "Run ", "Cycle", "Mountain Bike" ]
var activityPerforming: String?
override func viewDidLoad()
{
super.viewDidLoad()
activitiesTableView.dataSource = self
activitiesTableView.delegate = self
}
}
extension ActivitiesVC: UITableViewDelegate
{
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
activityPerforming = activityTitles[ indexPath.row ]
print(activityPerfoming) // displays optional value I want
}
}
// Custom Cell
class ActivityCell: UITableViewCell
{
@IBOutlet weak var imageLabel : UILabel!
@IBOutlet weak var activityLabel : UILabel!
override func awakeFromNib()
{
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
属性 显示为 nil 的原因是什么?我该如何补救这种情况?
我怀疑你的 unwind segue 直接连接到你的 UITableViewCell
所以它在调用 didSelectRowAtIndexPath
之前被触发。
要解决此问题,请将 didSelectRowAtIndexPath
中的代码移至 prepareForSegue
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let indexPath = activitiesTableView.indexPathForSelectedRow {
activityPerforming = activityTitles[ indexPath.row ]
print(activityPerfoming) // displays optional value I want
}
}
我有两个视图控制器。第二个视图控制器托管一个 table 视图,其中包含一个自定义单元格,该单元格展开回第一个视图控制器并发回与该单元格关联的数据。
在第二个视图控制器 class 中,我实现了 didSelectRowAtIndexPath 并进行了测试以查看 class 属性 中是否存储了正确的项目。它正确地存储了可选值,但是当我尝试在第一个视图控制器中使用该值时,属性 将 nil 打印到控制台。
// First view controller
@IBAction func unwindActivitiesVCCellTapped( segue: UIStoryboardSegue )
{
// table view cell tapped
guard let activitiesVC = segue.sourceViewController as? ActivitiesVC else { return }
print(activitiesVC.activityPerforming) // Displays nil in console output
if let activityPerforming = activitiesVC.activityPerforming // thus this does not get called
{
activityPerformingButton.titleLabel?.text = activityPerforming
}
}
// Second View Controller
class ActivitiesVC: UIViewController
{
@IBOutlet weak var activitiesTableView: UITableView!
let activityTitles = [ "Walk" , "Run ", "Cycle", "Mountain Bike" ]
var activityPerforming: String?
override func viewDidLoad()
{
super.viewDidLoad()
activitiesTableView.dataSource = self
activitiesTableView.delegate = self
}
}
extension ActivitiesVC: UITableViewDelegate
{
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
activityPerforming = activityTitles[ indexPath.row ]
print(activityPerfoming) // displays optional value I want
}
}
// Custom Cell
class ActivityCell: UITableViewCell
{
@IBOutlet weak var imageLabel : UILabel!
@IBOutlet weak var activityLabel : UILabel!
override func awakeFromNib()
{
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
属性 显示为 nil 的原因是什么?我该如何补救这种情况?
我怀疑你的 unwind segue 直接连接到你的 UITableViewCell
所以它在调用 didSelectRowAtIndexPath
之前被触发。
要解决此问题,请将 didSelectRowAtIndexPath
中的代码移至 prepareForSegue
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let indexPath = activitiesTableView.indexPathForSelectedRow {
activityPerforming = activityTitles[ indexPath.row ]
print(activityPerfoming) // displays optional value I want
}
}