在Swift中以编程方式设置Action Listener

时间:2014-12-09 03:57:54

标签: xcode swift

我看到一些示例代码将相同的OnClick事件分配给Android中的所有按钮(即使它们执行完全不同的操作)。如何使用Swift

Android示例:

@Override 
public void onCreate(Bundle savedInstanceState) {
        button1.setOnClickListener(onClickListener);
        button2.setOnClickListener(onClickListener);
        button3.setOnClickListener(onClickListener);
} 

private OnClickListener onClickListener = new OnClickListener() {
     @Override 
     public void onClick(View v) {
         switch(v.getId()){
             case R.id.button1:
                  //DO something 
             break; 
             case R.id.button2:
                  //DO something 
             break; 
             case R.id.button3:
                  //DO something 
             break; 
         } 

   } 
}; 

注意:我不想以编程方式创建按钮。

3 个答案:

答案 0 :(得分:68)

在iOS上,你没有设置一个监听器;你将一个目标(一个对象)和一个动作(方法签名,iOS中的“selector”)添加到UIControlUIButton是其子类):

button1.addTarget(self, action: "buttonClicked:", for: .touchUpInside)
button2.addTarget(self, action: "buttonClicked:", for: .touchUpInside)
button3.addTarget(self, action: "buttonClicked:", for: .touchUpInside)

第一个参数是目标对象,在本例中为self。该操作是一个选择器(方法签名),基本上有两个选项(稍后会有更多选项)。 control event有点特定于UIControl - .TouchUpInside通常用于点击按钮。

现在,行动。这是以下格式之一的方法(名称是您的选择):

func buttonClicked()
func buttonClicked(_ sender: AnyObject?)

要使用第一个使用“buttonClicked”,对于第二个(你想在这里)使用“buttonClicked:”(带尾随冒号)。 sender将成为事件的来源,换句话说,就是您的按钮。

func buttonClicked(_ sender: AnyObject?) {
  if sender === button1 {
    // do something
  } else if sender === button2 {
    // do something
  } else if sender === button3 {
    // do something
  }
}

(这假定button1button2button3是实例变量。)

使用big switch语句代替这一个方法考虑为每个按钮使用单独的方法。根据您的具体用例,任何一种方法都可能更好:

func button1Clicked() {
  // do something
}

func button2Clicked() {
  // do something
}

func button3Clicked() {
  // do something
}

在这里,我甚至没有使用sender参数,因为我不需要它。

P.S。:而不是以编程方式添加目标和操作,您可以在Storyboard或nib文件中执行此操作。为了公开您在函数前面放置IBAction的操作,例如:

@IBAction func button1Clicked() {
  // do something
}

答案 1 :(得分:44)

Swift 4。*

button.addTarget(self, action: #selector(didButtonClick), for: .touchUpInside)

按钮触发此功能:

@objc func didButtonClick(_ sender: UIButton) {
    // your code goes here
}

答案 2 :(得分:1)

Swift 5 扩展解决方案

创建一个 SwiftFile“SetOnClickListener.swift
复制粘贴此代码

import UIKit

class ClosureSleeve {
  let closure: () -> ()

  init(attachTo: AnyObject, closure: @escaping () -> ()) {
    self.closure = closure
    objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
  }

  @objc func invoke() {
    closure()
  }
}

extension UIControl {
    func setOnClickListener(for controlEvents: UIControl.Event = .primaryActionTriggered, action: @escaping () -> ()) {
        let sleeve = ClosureSleeve(attachTo: self, closure: action)
        addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
    }
}

如何使用
例如 buttonA 是一个 UIButton

buttonA.setOnClickListener {
  print("button A clicked")                  
}