Search code examples
iosswiftuitextfieldxibnib

how to show xib view when tap on textfield right button


I want to show a popup view when tap on textfield right button, I tried below code but view is not showing when tap on textfield right button. , I created xib view with "CustomeView" class name as below and I am , trying to load in alert view

  class ViewController: UIViewController, UITextFieldDelegate {

      let textFieldRightButton = UIButton(type: .infoLight)
    var textFieldOne:UITextField? = nil
    var alertview:UIView? = nil

    override func viewWillAppear(_ animated: Bool) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {

            self.showAlertViewWithTextField(title: "Test", msg: "Test Custome View", okActionTitle: "continue", cancelActionTitle: "Cancel", success: {
                print("Continue")
            }) {
                print("Cancel")
            }

        })
    }

    func showAlertViewWithTextField(title: String, msg: String, okActionTitle:String, cancelActionTitle:String, success: (() -> Void)? , cancel: (() -> Void)?)
    {
        let alert = UIAlertController(title: title, message: msg, preferredStyle: UIAlertController.Style.alert)
        alertview = alert.view

        textFieldRightButton.tintColor = UIColor.red

        alert.addTextField
            {
                (textField) in
                textField.placeholder = "Enter text."
                textField.delegate = self
                textField.rightViewMode = .always
                textField.rightView = self.textFieldRightButton

        }

        textFieldOne = alert.textFields?.first

         textFieldRightButton.addTarget(self, action: #selector(showPopupMsg), for: .touchUpInside)

        let successAction: UIAlertAction = UIAlertAction(title: okActionTitle, style: .destructive)
        {
            action -> Void in
            success?()
        }
        let cancelAction: UIAlertAction = UIAlertAction(title: cancelActionTitle, style: .cancel)
        {
            action -> Void in
            cancel?()
        }

        alert.addAction(successAction)
        alert.addAction(cancelAction)
        UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)
    }

    @objc func showPopupMsg() {
        alertview?.addSubview(CustomeView(frame: CGRect(x: textFieldOne!.frame.minX, y: textFieldOne!.frame.minX, width: 100, height: 50)))
    }

}

below is my custom view

  class CustomeView: UIView {
            @IBOutlet var contentView: UIView!
            @IBOutlet weak var messageText: UILabel!

            override init(frame: CGRect) {
                super.init(frame: frame)
                commonInit()
            }

            required init?(coder aDecoder: NSCoder) {
             super.init(coder: aDecoder)
                commonInit()
            }

            private func commonInit(){
                Bundle.main.loadNibNamed("CustomeView", owner: self, options: nil)
                addSubview(contentView)
                contentView.frame = self.bounds
                contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
           }

        }

How can I show this nib view in view controller?


Solution

  • I tried with your code snippet and I got bad access error. Try removing the custom class (CustomeView) of that xib file and set the CustomeView view class in File's Owner of that xib file. Also check your messageText and contentView outlet object type should be the File's Owner.

    Outlet

    File Owner