代码之家  ›  专栏  ›  技术社区  ›  iHarshil l0gg3r

我的自定义UIView未从SuperView中删除

  •  3
  • iHarshil l0gg3r  · 技术社区  · 7 年前

    弹出视图 我把它加到 视图控制器

    我已经创建了一个委托方法 didtaponokpoup() 因此,当我在PopUpView中单击Ok按钮时,它应该从使用它的委托的ViewController中删除。

    弹出视图。斯威夫特

    protocol PopUpViewDelegate: class {
        func didTapOnOKPopUp()
    }
    
    
    class PopUpView: UIView {
    weak var delegate : PopUpViewDelegate?
    
    @IBAction func btnOkPopUpTap(_ sender: UIButton)
        {
            delegate?.didTapOnOKPopUp()
        }
    }
    

    这是你的密码 放弃PasswordViewController 在这里我使用委托方法。

    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()
        }
    }
    

    我试过了 this 但没有成功!请帮帮我。谢谢

    3 回复  |  直到 7 年前
        1
  •  5
  •   CZ54    7 年前

    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 将返回与弹出窗口相同的实例

        2
  •  4
  •   Ozgur Vatansever    7 年前

    每次你打电话 .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()
      }
    }
    
        3
  •  0
  •   iHarshil l0gg3r    7 年前

    每次调用函数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 
      }()