Swift 使用完成处理程序将视图锁定在一个控制器中以反映在另一个控制器中

Posted

技术标签:

【中文标题】Swift 使用完成处理程序将视图锁定在一个控制器中以反映在另一个控制器中【英文标题】:Swift using completion handlers to lock a view in one controller to reflect in another 【发布时间】:2018-12-19 17:21:00 【问题描述】:

我想实现的目标似乎存在时间问题。

我希望实现以下内容。

    用户到达屏幕(视图控制器)并准备“锁定”那里的选择 锁定/解锁图标位于导航栏的右上角 用户点击图标锁定 显示 UIAlert 框,确认用户想要锁定他们的选择 用户确认 向用户显示不同的视图,允许他们输入“PIN” 如果他们点击取消,关闭 PIN 视图控制器并且锁定状态保持解锁状态 如果他们单击“提交”,则关闭 PIN 模式视图控制器 右上角的图标需要更改为“锁定”图标

除了图标和状态没有正确更新之外,一切似乎都正常工作,因为似乎一旦用户出现 PIN 模式视图控制器,代码就会继续执行,其中“锁定”状态保持为'解锁',因为用户没有输入他们的 PIN 并点击提交,这会改变'锁定'状态?

完成处理程序是否可以“暂停”状态,直到用户显示模态窗口,然后输入 PIN,然后提交他们的 PIN...并记住,如果用户希望不再锁定什么,也可以点击取消有什么理由吗?

【问题讨论】:

你说的是视图控制器的完成处理程序吗?在呈现视图控制器后立即调用哪个? 如果你展示你的代码会更好,这样人们就不必猜测到底发生了什么 【参考方案1】:

FirstViewController 中,您可以在完成锁定/解锁导航项单击时添加,

func lockOrUnlock() 
    let pinVC = PinViewController()
    pinVC.onCompletion =  [weak self] (isPinChanged) in
        //change the lock/unlock icon based on isPinChanged flag
        //if true then update the status else revert the status to prev one
        
    let pinVCNavController = UINavigationController(rootViewController: pinVC)
    pinVCNavController.modalPresentationStyle = .currentContext
    self.present(pinVCNavController, animated: true, completion: nil)

PinViewController中,根据用户选择提交或取消操作,返回标志值为true or false

var onCompletion: ((Bool) -> Void)?

override func viewDidLoad() 
    super.viewDidLoad()
    let cencelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelAction))
    self.navigationItem.leftItemsSupplementBackButton = true
    self.navigationItem.leftBarButtonItem = cencelButton


@IBAction func submitAction(_ sender: Any) 
    self.onCompletion?(true)


func cancelAction() 
    self.onCompletion?(false)

【讨论】:

所以这在本质上已经取代了protocols 的使用而不是completion handlers?我问是因为目前我正在使用协议将信息从子 VC 传递回父 VC。但似乎代码只是继续前进,而不是等待用户的输入,因此状态永远不会更改为“及时”锁定,以便代码识别出值已更改。 我冒昧地说,在您的方法中,完成句柄将等待,无论用户需要多长时间才能提供输入/操作,然后才会根据单击“提交”或“取消”更改锁定状态并且模态视图被关闭。 您也可以使用协议,完成只是实现解决方案的一种选择 我使用了该协议,正如我所说,代码似乎只是在继续前进,当使用“提交”或“取消”时,主踏板上的代码已使用执行 Firebase 更新最初的LockStatus 为假。

以上是关于Swift 使用完成处理程序将视图锁定在一个控制器中以反映在另一个控制器中的主要内容,如果未能解决你的问题,请参考以下文章

swift 4中的完成处理程序

Swift - 如何让分段控制锁定在屏幕顶部

在 Swift 中向 UIViewPropertyAnimator 添加完成处理程序

Swift Closures - 将自己视为弱者

如何使用 Swift 完成处理程序的结果?

在 Swift 中创建可重用视图并添加完成处理程序