Enrik Qaz
Enrik Qaz

Reputation: 253

Button click not working for custom UIView

Code for the Custom UIView:

Please check the video too here: https://drive.google.com/open?id=1kbrOxXWcJIi4vkiqMNer3exBr5cOWgDz

 import UIKit
    protocol PostAttachmentFullScreenViewDelegate: class {
        func closeAttachmentFullView()
    }

    class PostAttachmentFullScreenView: UIView {

        weak var delegate: PostAttachmentFullScreenViewDelegate?

        @IBOutlet var backgroundView: UIImageView!

        @IBOutlet var closeButton: UIButton!
        @IBAction func closeViewAction(_ sender: Any) {
            print("will call delegate to put it off")
            self.delegate?.closeAttachmentFullView()
        }


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

            let _ = commonInitialization()
            backgroundView.image = UIImage(named: "ScrollImageTop1")
           closeButton.isUserInteractionEnabled = true
        }

        override init(frame: CGRect) {
            super.init(frame: frame)
             let _ = commonInitialization()

            backgroundView.image = UIImage(named: "ScrollImageTop1")
            closeButton.isUserInteractionEnabled = true

        }

        func commonInitialization() -> UIView
        {
            let bundle = Bundle.init(for: type(of: self))
            let nib = UINib(nibName: "PostAttachmentFullScreenView", bundle: bundle)
            let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
            view.frame = bounds
            view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
            addSubview(view)
            return view

        }


    }

usage in ViewController (I am defining an instance of the custom view and putting it inside the Scroll View):

        var frame  = CGRect(x:0, y:0, width:0, height:0)
        let blue = PostAttachmentFullScreenView()
        blue.delegate = self
        blue.isUserInteractionEnabled = true
        blue.backgroundColor = UIColor.blue
        blue.backgroundView.image = fileAttachments[1]

        frame.origin.x = attachmentsScrollView.frame.size.width * CGFloat (0)
        frame.size = attachmentsScrollView.frame.size
        blue.frame = frame
        attachmentsScrollView.addSubview(blue)


extension NewPostViewController : PostAttachmentFullScreenViewDelegate
{
    func closeAttachmentFullView() {
        print("hiding attachments view")
        attachmentSuperView.isHidden = true
    }
}

To my surprise it doesn't even print - "will call delegate to put it off". I am not able to understand what's wrong here. Please help me understand the issue and correct it. Thank you.

Upvotes: 1

Views: 3801

Answers (3)

marvatron
marvatron

Reputation: 331

This might be an obvious one but for me (Xcode 10.1) adding all missing UI constraints to the UIButton in question (at least 4 constraints) fixed the error for me in my custom view:

Add New Constrain button at the bottom

Add New Constraint options

Make sure you add enough constraints (typically 4 constraints) or enough to have all warnings regarding missing constraints removed. After doing this and attaching the button with Ctrl + drag from View to corresponding swift code, the click was being detected and working properly.

Hope this helps.

Upvotes: 0

Amit
Amit

Reputation: 4896

You are mixing programmatic approach and xib approach.

As you have added IBOultet and IBAction that means you are using xib for the UIView.

In that scenario you have to load the UIView xib when initialising the view.

Add an extension for UIView in your project:

extension UIView {
    class func fromNib<T: UIView>() -> T {
        return Bundle.main.loadNibNamed(String(describing: T.self), owner: nil, options: nil)![0] as! T
    }
}

when you are initialising your view add it like this :

let blue : PostAttachmentFullScreenView = UIView.fromNib()
blue.delegate = self
blue.isUserInteractionEnabled = true
blue.backgroundColor = UIColor.blue
blue.backgroundView.image = fileAttachments[1]

frame.origin.x = attachmentsScrollView.frame.size.width * CGFloat (0)
frame.size = attachmentsScrollView.frame.size
blue.frame = frame
attachmentsScrollView.addSubview(blue)

and the delegate and button action methods will work.

you missed this :

enter image description here

Upvotes: 1

Duncan C
Duncan C

Reputation: 131511

You never set the target/action on your button. Somewhere you need to call addTarget(_:action:for:) to set the target/action on the button. Also, what connects the button to your PostAttachmentFullScreenView as an outlet?

Upvotes: 0

Related Questions