取消保存更改。与<back

时间:2019-05-09 13:48:09

标签: swift navigation

=“”

结合使用时,我很难理解如何使用默认的Back BarButtonItem以及如何激发倒带。

下面显示了简化的布局。我将ViewController嵌入导航控制器中,并添加BarButtonItem(“ Show”)并连接到第二个VC。如下所示,这将“ Back”按钮添加到第二个控制器。 Basic Back Button

在第一个VC中,我将向用户显示一些详细信息,在第二个VC中,将显示更多详细信息。使用显示按钮和默认的后退按钮,用户可以轻松地以预期的行为来回导航。

我的问题在于,允许用户修改“此处的更多详细信息”,并且用户退后后,我需要将其传递给第一个VC。

我无法控制从“后退”到“退出”图标的拖动,但是我确定可以使用导航栏上的“保存”按钮来完成此操作,如图所示。 (首先将导航项拖动到顶部,然后拖动BarButtonItem),然后按住Control并拖动到退出图标。

With Save Button

使用“保存”按钮,我可以启动segue展开并使用以下代码在我的第一个VC中捕获更改。

   @IBAction func unwindFromSecondVC(_ sender: UIStoryboardSegue) {       
        if sender.source is AddCharacterViewController {
            if let senderVC = sender.source as? SecondViewController {
              details = senderVC.newDetails
            }       
        }
    }

当用户进行更改然后单击“后退”按钮从而丢失更改时,这会产生问题。

我的首选解决方案是让“后退”按钮启动搜索并转移更改。但这似乎是不可能的。我的第二个解决方案是让“后退”按钮通知您尚未进行转帐,并停止退票。根据我的研究,两种方法都不可行。

在为用户提供常见的“后退”导航时,我该如何最好地解决此问题?

1 个答案:

答案 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或类似方法调用委托。