Мой пользовательский UIView не удаляется из SuperView - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть один PopUpView , который я добавляю к ViewController .

Я создал метод делегата didTapOnOKPopUp () , чтобы при нажатии кнопки «Ок» в PopUpView он удалялся из ViewController, который использует его делегат.

Вот код для PopUpView.Swift

protocol PopUpViewDelegate: class {
    func didTapOnOKPopUp()
}


class PopUpView: UIView {
weak var delegate : PopUpViewDelegate?

@IBAction func btnOkPopUpTap(_ sender: UIButton)
    {
        delegate?.didTapOnOKPopUp()
    }
}

Вот код для ForgotPasswordViewController , где я использую метод делегата.

class ForgotPasswordViewController: UIViewController, PopUpViewDelegate {

// I have created an Instance for the PopUpView and assign Delegate also.

func popUpInstance() -> UIView {
        let popUpView = UINib(nibName: "PopUpView", bundle: nil).instantiate(withOwner: nil, options: nil).first as! PopUpView
        popUpView.delegate = self
        return popUpView
    }
// Here I am adding my view as Subview. It's added successfully.
@IBAction func btnSendTap(_ sender: UIButton) {
        self.view.addSubview(self.popUpInstance())
    }

It's added successfully

// But when I tapping on OK Button. My PopUpView is not removing from it's View Controller. 

func didTapOnOKPopUp() {

        self.popUpInstance().removeFromSuperview()
    }
}

Я пытался это , но безуспешно! Помогите мне, пожалуйста. Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Каждый раз, когда вы вызываете .popUpInstance(), он создает новый экземпляр PopupView, в результате чего вы теряете ссылку на ранее созданную и добавленную в иерархию представления.

Определите popUpView как переменную экземпляра, и вы должны хорошо идти:

class ForgotPasswordViewController: UIViewController, PopUpViewDelegate {

  private lazy var popupView: PopUpView = {
    let popUpView = UINib(nibName: "PopUpView", bundle: nil)
      .instantiate(withOwner: nil, options: nil)
      .first as! PopUpView

     popUpView.delegate = self
     return popUpView
  }()

  @IBAction func btnSendTap(_ sender: UIButton) {
    self.view.addSubview(self.popupView)
  }

  func didTapOnOKPopUp() {
    self.popupView.removeFromSuperview()
  }
}
0 голосов
/ 05 ноября 2018

Каждый раз, когда вы вызываете функцию popUpInstance, вы создаете другой экземпляр PopUpView, когда вы делаете это, ваш делегат не имеет значения.

Вы можете сделать эту часть кода несколькими способами:

  1. создать функцию popUpInstance () и сохранить экземпляр как параметр класса

  2. сделать параметр класса подобным этому

    private lazy var popupView: PopUpView = {
        let popUpView = UINib(nibName: "PopUpView", bundle: nil).instantiate(withOwner: nil, options: nil).first as! PopUpView
        popUpView.delegate = self
        return popUpView 
    }()
    
0 голосов
/ 05 ноября 2018

Каждый вызов popupinstance() создает новый PopUp Просмотр.

Вы можете создать ссылку на созданное всплывающее окно:

private var displayedPopUp: UIView?
@IBAction func btnSendTap(_ sender: UIButton) {
    displayedPopUp = self.popUpInstance()
    self.view.addSubview(displayedPopUp)
}


func didTapOnOKPopUp() {
    self.displayedPopUp?.removeFromSuperview()
    displayedPopUp = nil
}

Но я думаю, что в вашем случае лучше использовать lazy var:

заменить

func popUpInstance() -> UIView {
        let popUpView = UINib(nibName: "PopUpView", bundle: nil).instantiate(withOwner: nil, options: nil).first as! PopUpView
        popUpView.delegate = self
        return popUpView
    }

по:

lazy var popUpInstance : UIView =  {
        let popUpView = UINib(nibName: "PopUpView", bundle: nil).instantiate(withOwner: nil, options: nil).first as! PopUpView
        popUpView.delegate = self
        return popUpView
    }()

Теперь каждый вызов popUpInstance будет возвращать один и тот же экземпляр вашего всплывающего окна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...