【问题标题】:My Custom UIView is not removed from SuperView我的自定义 UIView 没有从 SuperView 中删除
【发布时间】:2019-04-08 13:30:54
【问题描述】:

我有一个 PopUpView,我将其添加到 ViewController

我创建了一个委托方法 didTapOnOKPopUp(),这样当我在 PopUpView 中单击 Ok 按钮时,它应该从使用它的委托的 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())
    }

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

func didTapOnOKPopUp() {

        self.popUpInstance().removeFromSuperview()
    }
}

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

【问题讨论】:

    标签: ios swift uiview


    【解决方案1】:

    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】:

    每次调用 .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】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2020-04-28
      • 2021-12-31
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2011-04-11
      相关资源
      最近更新 更多