结合使用时,我很难理解如何使用默认的Back BarButtonItem以及如何激发倒带。
下面显示了简化的布局。我将ViewController嵌入导航控制器中,并添加BarButtonItem(“ Show”)并连接到第二个VC。如下所示,这将“ Back”按钮添加到第二个控制器。
在第一个VC中,我将向用户显示一些详细信息,在第二个VC中,将显示更多详细信息。使用显示按钮和默认的后退按钮,用户可以轻松地以预期的行为来回导航。
我的问题在于,允许用户修改“此处的更多详细信息”,并且用户退后后,我需要将其传递给第一个VC。
我无法控制从“后退”到“退出”图标的拖动,但是我确定可以使用导航栏上的“保存”按钮来完成此操作,如图所示。 (首先将导航项拖动到顶部,然后拖动BarButtonItem),然后按住Control并拖动到退出图标。
使用“保存”按钮,我可以启动segue展开并使用以下代码在我的第一个VC中捕获更改。
@IBAction func unwindFromSecondVC(_ sender: UIStoryboardSegue) {
if sender.source is AddCharacterViewController {
if let senderVC = sender.source as? SecondViewController {
details = senderVC.newDetails
}
}
}
当用户进行更改然后单击“后退”按钮从而丢失更改时,这会产生问题。
我的首选解决方案是让“后退”按钮启动搜索并转移更改。但这似乎是不可能的。我的第二个解决方案是让“后退”按钮通知您尚未进行转帐,并停止退票。根据我的研究,两种方法都不可行。
在为用户提供常见的“后退”导航时,我该如何最好地解决此问题?
答案 0 :(得分:0)
如果要保存用户在第二个VC中所做的任何更改,可以创建一个SecondVCDelegate
:
protocol SecondVCDelegate : class {
func detailsDidChange(newDetails: String)
}
在SecondVC
中,声明一个delegate
属性:
weak var delegate: SecondVCDelegate?
每当详细信息更改(文本字段的值更改,或发生任何事件)时,您都要致电
delegate?.detailsDidChange(newDetails: newDetails)
在FirstVC.prepareForSegue
中,应将self
设置为SecondVC
的委托人:
if let vc = segue.destination as? SecondVC {
vc.delegate = self
}
// ...
extension FirstVC : SecondVCDelegate {
func detailsDidChange(newDetails: String) {
details = newDetails
}
}
这样,每当newDetails
更改时,FirstVC
都会收到通知。
如果您只想在用户离开FirstVC
时通知SecondVC
,则可以改用SecondVC.viewWillDisappear
或类似方法调用委托。