我得到了一个iPad设计的应用程序,使用SplitViewController显示两个视图,一个显示联系人列表,另一个显示此联系人的详细信息。SplitView在iPad上运行良好,但在iphone上有一些问题。
有一个采用主视图的所有大小的UIControl,该UIControl检查用户是否有任何.touchDown interaction以及调用的一些方法来启用或禁用此UIControl,这取决于我们是否在编辑联系人模式或不允许用户与屏幕交互:

private var disableInteractionClosure: (()->())?
    private lazy var interactionOverlay: UIControl = {
        let c = UIControl()
        c.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
        c.addTarget(self, action: "interactionOverlayAction", forControlEvents: .TouchDown)
        return c
    }()

    func disableInteractionWhileEditingWithClosure(callback: ()->()) {
        if disableInteractionClosure == nil {
            disableInteractionClosure = callback
            /* display control overlay */
            interactionOverlay.frame = navigationController!.view.bounds
            navigationController!.view.addSubview(interactionOverlay)
        }
    }

    func interactionOverlayAction() {
        disableInteractionClosure!()
    }

    func enableInteraction() {
        disableInteractionClosure = nil
        interactionOverlay.removeFromSuperview()
    }

基本上,UIControl用于阻止用户在编辑另一个联系人/通过阻止与联系人列表的交互创建新联系人时在联系人之间进行切换,如果在编辑/创建视图上进行了更改,则会触发一个方法,显示一个弹出窗口,显示“已进行了修改是否要继续而不保存”?取消或继续:
func cancel() {
        self.view.endEditing(true)

        let closure: ()->() = {
            self.layoutView.willResign()
            self.delegate?.tabDetailsControllerDidCancel(self)
        }

            if layoutView.hasChanges() {
                MKAlertViewController().instantaneousAlert(title: "Modification apportées", message: "Êtes-vous sur de vouloir continuer sans sauvegarder les modifications ?", confirmButtonTitle: "Oui", cancelButtonTitle: "Annuler", confirmed: { () -> Void in
                    closure()
                    }, canceled: { () -> Void in

                })
            } else {
                closure()
            }

    }

它在iPad上运行良好,因为UIControl仅位于主视图上方,并且在详细视图(iPad 3D Debugging view)的编辑模式下启用,因此仅当手动取消编辑/创建或在编辑/创建时尝试更改联系人时才会显示弹出窗口,但由于splitView在ipad和iPhone上的工作方式不同,而且在iPhone上主视图似乎位于详细视图之上,UIControl也位于(iPhone 3D Debugging view)之上,这会导致在所有屏幕上以及在我单击的任何位置显示取消弹出窗口时阻止交互。
你们能给我解释一下只有在主视图显示时才启用/显示这个UIControl的方法,而不是在任何地方。谢谢。

最佳答案

我最后在细节视图上使用了viewWillDisappear

override func viewWillDisappear(animated: Bool) {

        super.viewWillDisappear(animated)

        if self.isMovingFromParentViewController() || self.isBeingDismissed() {
            if editingMode {
                shared.contactsListController.disableInteractionWhileEditingWithClosure({ (_) in
                    self.tabDetailsController.cancel()
                })
                shared.contactsListController.disableToolbar()
            } else {
                shared.contactsListController.enableInteraction()
                shared.contactsListController.enableToolbar()
            }
            self.navigationController?.toolbar.alpha = 1
        }
    }

在主视图上修改disableInteractionWhileEditingWithClosure方法:
func disableInteractionWhileEditingWithClosure(callback: ()->()) {
        if disableInteractionClosure == nil {
            disableInteractionClosure = callback
            /* display control overlay */
            interactionOverlay.frame = navigationController!.view.bounds

            view.addSubview(interactionOverlay) // this line
        }
    }

而且有效!:)

关于ios - UIControl阻止了我在iPhone上的所有 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36127040/

10-11 20:51