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

时间:2018-12-19 17:21:01

标签: ios swift completionhandler

看来我在尝试达到的目标方面存在时间问题。

我希望实现以下目标。

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

除了图标和状态无法正确更新之外,所有其他功能似乎都可以正常工作,因为似乎一旦用户获得PIN模态视图控制器,代码就会继续执行,并且“ Lock”状态保持为由于用户未输入PIN并点击提交,这将更改“锁定”状态,因此“已解锁”?

完成处理程序可以将状态“挂起”直到用户显示模式窗口,然后输入PIN,然后提交其PIN ...并记住,如果用户希望不再锁定该内容,也可以单击“取消”有理由吗?

1 个答案:

答案 0 :(得分: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)
}