Swift:UIButton触摸事件未在自定义视图中调用

时间:2022-06-13 08:50:37

I have created a custom view from xib(freeform) in which there are two button (Login and cancel) and i have present it at a view according to some condition. Custom view get present on another view nicely but the button(Login an cancel) not getting any touch event.

我已经从xib(*格式)创建了一个自定义视图,其中有两个按钮(登录和取消),我根据某些条件在视图中显示它。自定义视图很好地出现在另一个视图上,但按钮(登录取消)没有得到任何触摸事件。

Code of custom class and init method:

自定义类和init方法的代码:

import UIKit
class customAlertView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var loginButton : UIButton!
  @IBOutlet weak var cancelButton: UIButton!

  var view : UIView!


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

    view  = setUpFromXib()
    view.frame  = frame
  }

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

  func setUpFromXib() -> UIView {

    let bundle  = NSBundle(forClass: self.dynamicType)
    let nib     = UINib(nibName: "customAlertView", bundle: bundle)
    let view    = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    addSubview(view)
    translatesAutoresizingMaskIntoConstraints = true
    return view

  }

  @IBAction func loginButtonAction(sender: AnyObject) {
  }

  @IBAction func cancelButtonAction(sender: AnyObject) {
  }
}

This is the block of code from where i have add the custom view as a subview.

这是我将自定义视图添加为子视图的代码块。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        if Reachability.isConnectedToNetwork() {

            categoryObj = categoryArray .objectAtIndex(indexPath.row) as! TECategoryDetails
            if categoryObj.categoryType == "premium" {

              let screen = UIScreen.mainScreen().bounds

             customView  = customAlertView.init(frame: CGRect(origin: CGPoint(x: 0,y: 80), size: CGSize(width: screen.width, height: screen.height/3)))
              self.view .addSubview(customView)

                }

            else{
              watchAllFlag = false
              self.performSegueWithIdentifier("Episode", sender: self)
            }
        }
        else {
            self.showAlertPopUp() 

        }
    }

2 个解决方案

#1


1  

You can also do like this way.

你也可以这样做。

import UIKit
class customAlertView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var loginButton : UIButton!
  @IBOutlet weak var cancelButton: UIButton!

  var view : UIView!


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

    view  = setUpFromXib()
    view.frame  = frame

    loginButton.addTarget(self, action: Selector(“loginButtonAction:”), forControlEvents: .TouchUpInside)
    cancelButton.addTarget(self, action: Selector(“cancelButtonAction:”), forControlEvents: .TouchUpInside)


  }

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

  func setUpFromXib() -> UIView {

    let bundle  = NSBundle(forClass: self.dynamicType)
    let nib     = UINib(nibName: "customAlertView", bundle: bundle)
    let view    = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    addSubview(view)
    translatesAutoresizingMaskIntoConstraints = true
    return view

  }

  func loginButtonAction(sender: AnyObject) {


  }

  func cancelButtonAction(sender: AnyObject) {


  }

}

#2


1  

Check it, its working:

检查一下,它的工作原理:

ViewController.swift:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }


    @IBAction func displayAlertBtnTapped(sender: AnyObject) {
        let screen = UIScreen.mainScreen().bounds
        let customView = CustomAlertView.init(frame: CGRect(origin: CGPoint(x: 0,y: 80), size: CGSize(width: screen.width, height: screen.height/3)))
        self.view .addSubview(customView)
    }
}

Swift:UIButton触摸事件未在自定义视图中调用

CustomAlertView.swift:

import UIKit

class CustomAlertView: UIView {

    @IBOutlet weak var loginButton : UIButton!
    @IBOutlet weak var cancelButton: UIButton!

    var view : UIView!


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

        view  = setUpFromXib()
        view.frame  = frame
    }

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

    func setUpFromXib() -> UIView {

        let bundle  = NSBundle(forClass: self.dynamicType)
        let nib     = UINib(nibName: "CustomAlertView", bundle: bundle)
        let view    = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        addSubview(view)
        translatesAutoresizingMaskIntoConstraints = true
        return view

    }

    @IBAction func loginButtonAction(sender: AnyObject) {

        print("Login button clicked");
    }

    @IBAction func cancelButtonAction(sender: AnyObject) {
        print("Cancel button clicked");
    }

}

Swift:UIButton触摸事件未在自定义视图中调用

For testing, use the following GitHub link:

要进行测试,请使用以下GitHub链接:

https://github.com/k-sathireddy/AlertViewSample

https://github.com/k-sathireddy/AlertViewSample

#1


1  

You can also do like this way.

你也可以这样做。

import UIKit
class customAlertView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var loginButton : UIButton!
  @IBOutlet weak var cancelButton: UIButton!

  var view : UIView!


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

    view  = setUpFromXib()
    view.frame  = frame

    loginButton.addTarget(self, action: Selector(“loginButtonAction:”), forControlEvents: .TouchUpInside)
    cancelButton.addTarget(self, action: Selector(“cancelButtonAction:”), forControlEvents: .TouchUpInside)


  }

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

  func setUpFromXib() -> UIView {

    let bundle  = NSBundle(forClass: self.dynamicType)
    let nib     = UINib(nibName: "customAlertView", bundle: bundle)
    let view    = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    addSubview(view)
    translatesAutoresizingMaskIntoConstraints = true
    return view

  }

  func loginButtonAction(sender: AnyObject) {


  }

  func cancelButtonAction(sender: AnyObject) {


  }

}

#2


1  

Check it, its working:

检查一下,它的工作原理:

ViewController.swift:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }


    @IBAction func displayAlertBtnTapped(sender: AnyObject) {
        let screen = UIScreen.mainScreen().bounds
        let customView = CustomAlertView.init(frame: CGRect(origin: CGPoint(x: 0,y: 80), size: CGSize(width: screen.width, height: screen.height/3)))
        self.view .addSubview(customView)
    }
}

Swift:UIButton触摸事件未在自定义视图中调用

CustomAlertView.swift:

import UIKit

class CustomAlertView: UIView {

    @IBOutlet weak var loginButton : UIButton!
    @IBOutlet weak var cancelButton: UIButton!

    var view : UIView!


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

        view  = setUpFromXib()
        view.frame  = frame
    }

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

    func setUpFromXib() -> UIView {

        let bundle  = NSBundle(forClass: self.dynamicType)
        let nib     = UINib(nibName: "CustomAlertView", bundle: bundle)
        let view    = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        addSubview(view)
        translatesAutoresizingMaskIntoConstraints = true
        return view

    }

    @IBAction func loginButtonAction(sender: AnyObject) {

        print("Login button clicked");
    }

    @IBAction func cancelButtonAction(sender: AnyObject) {
        print("Cancel button clicked");
    }

}

Swift:UIButton触摸事件未在自定义视图中调用

For testing, use the following GitHub link:

要进行测试,请使用以下GitHub链接:

https://github.com/k-sathireddy/AlertViewSample

https://github.com/k-sathireddy/AlertViewSample