如何在单独的自定义视图中为按钮创建操作

Posted

技术标签:

【中文标题】如何在单独的自定义视图中为按钮创建操作【英文标题】:How to create an action for the button in separate custom view 【发布时间】:2017-02-11 11:06:07 【问题描述】:

如何在nib 创建的自定义视图 中为按钮 创建一个动作。 我创建了一个Outlet,它连接到自定义ViewController,但是当我尝试执行操作时,它不起作用。

【问题讨论】:

[YOURBUTTON addTarget:self action:@selector(METHODNAME) forControlEvents:UIControlEventTouchDown]; func METHODNAME() print("按钮点击") 当您尝试从笔尖创建 IBAction 时遇到什么错误?或者它不允许与视图控制器连接? 是的@AdiHardik,它不允许我连接控制器。这只发生在动作和插座工作正常.. @BoobalanNatarajan 您是尝试从 nib 按钮对象还是从“触发的 segues ->”“动作”下的右侧菜单进行连接? 我有一个单独的视图,其中有一个带有单独视图控制器的按钮,我已经使用“loadNibNamed”将单独的视图称为主视图控制器的视图。单独的视图在运行时加载到主视图,但是放置在单独视图中的按钮的操作不允许我连接单独的视图控制器.. @AdiHardik 【参考方案1】:

这是你可以做的

改为创建您的 VIEW(自定义视图)的出口。然后像这样将选择器添加到按钮

self.viewName.buttonName addTarget:self action:@selector(actionName) forControlEvents:UIControlEventTouchUpInside];

还有其他选项,例如将块传递给视图或使用委托模式,但是执行这样一个简单的任务将更加过分。当您在 XIB 中处理单独的视图时,这会更简单更好

【讨论】:

【参考方案2】:

如果您正在使用 nib 或故事板文件,那么您甚至不需要按钮的插座。只需从按钮拖动到您的班级,然后选择“操作”而不是“出口”。它甚至可以让您选择要接收的操作类型,例如“TouchUpInside”。如果您需要对按钮进行更改,在它被点击后,您也可以在新生成的方法中进行更改,因为它有一个 sender 属性,即您的按钮。

【讨论】:

【参考方案3】:
yourView.yourButton.addTarget(self, action: #selector(yourFuncName(_:)), for: .touchUpInside)

然后在某处声明你的函数如下:

  @objc func yourFuncName(_ sender: UIButton) 
        do something here

【讨论】:

【参考方案4】:
//Button action using both addTarget and Closure

    import UIKit

    class ViewController: UIViewController 

        @IBOutlet weak var imageView: CustomImageView!

        @IBOutlet weak var awesomeView: AwesomeView!

        override func viewDidLoad() 
            super.viewDidLoad()
            // Do any additional setup after loading the view.

            awesomeView.button1.addTarget(self, action: #selector(button1Action(_:)), for:  .touchUpInside)
            awesomeView.button2Pressed = 
                print("Closure button pressed")
            

        

        @objc func button1Action(_ sender: UIButton) 
    //           do something here
        

    

    //UIView Declaration

    @IBDesignable class AwesomeView: UIView 

        let kCONTENT_XIB_NAME = "AwesomeView"

        @IBOutlet var containerView: UIView!
        @IBOutlet weak var button1 : UIButton!
        @IBOutlet weak var button2 :UIButton!

        //create your closure here
        var button2Pressed : (() -> ()) = 

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

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

        func initNib() 
            let bundle = Bundle(for: AwesomeView.self)
            bundle.loadNibNamed(kCONTENT_XIB_NAME, owner: self, options: nil)
            addSubview(containerView)
            containerView.frame = bounds
            containerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        

        @IBInspectable var button1Title: String = "" 
            didSet 
                button1.setTitle(button1Title, for: .normal)
            
        

        @IBAction func tapOnButtonPressed(_ sender: Any) 


        

        @IBAction func tapOnButton2Pressed(_ sender: Any) 
            button2Pressed()

        

    

【讨论】:

以上是关于如何在单独的自定义视图中为按钮创建操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?

如何从情节提要中的自定义视图制作@IBAction?

我的自定义 UIView 没有显示在屏幕上

如何在MonoTouch中为继承的视图创建UIAppearance代理?

在 Interface Builder 中,如何将 UIViews 添加到属于我创建的自定义视图的子视图?

带有自定义后退导航按钮的自定义按钮栏