2016-03-21 3 views
1

У меня есть приложение, разработанное iPad, с использованием SplitViewController, показывающего два вида: один с списком контактов и другой с подробностями этого контакта. SplitView хорошо работает на iPad, но имеет некоторые проблемы на iPhone.UIControl блокирует все мои взгляды на iPhone

Существует UIControl, который принимает все размеры Master View, которые проверяют, есть ли у пользователя .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используется для блокировки пользователя от переключения между контактом во время пользователя редактирует другой контакт/создание нового, блокируя взаимодействие со списком контактов и если изменения были сделаны на экране редактирования/создания, он запускает метод, который показывает всплывающее окно p сказал: «Были сделаны изменения, вы хотите продолжить без сохранения? отменить или продолжить ":

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 только над Master View и включается, когда в режиме редактирования на Detail View (iPad 3D Debugging view), поэтому всплывал показывает только при ручной отмены редактирование/создание или при попытке изменить контакт при редактировании/создании, но поскольку splitView не работают одинаково на iPads и iPhones, и похоже, что на iPhone главный вид расположен над подробным представлением, также находится UIControl (iPhone 3D Debugging view), и это вызывает блокировку взаимодействий на всем экране и везде, где я нажимаю всплывающее окно отмены.

Можете ли вы, ребята, объяснить мне способ включить/показать этот UIControl только тогда, когда MasterView показывается, а не везде. Благодарю.

ответ

0

Я закончил с использованием 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 
     } 
    } 

и это работает! :)

Смежные вопросы