programing

매개 변수를 button.addSwift에서 Target 액션에 추가합니다.

stoneblock 2023. 8. 2. 08:41

매개 변수를 button.addSwift에서 Target 액션에 추가합니다.

클릭한 작업 단추에 추가 매개 변수를 전달하려고 하지만 Swift에서 구문이 무엇인지 알 수 없습니다.

button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)

임의의 my button클릭 방법:

func buttonClicked(sender:UIButton)
{
    println("hello")
}

생각나는 사람?

도와주셔서 고마워요.

사용자 지정 매개 변수를 에 전달할 수 없습니다.addTarget:한 가지 대안은 다음과 같이 설정하는 것입니다.tag버튼 속성을 입력하고 태그를 기반으로 작업을 수행합니다.

button.tag = 5
button.addTarget(self, action: "buttonClicked:", 
    forControlEvents: UIControlEvents.TouchUpInside)

또는 Swift 2.2 이상의 경우:

button.tag = 5
button.addTarget(self,action:#selector(buttonClicked),
    forControlEvents:.TouchUpInside)

이제 다음을 기반으로 논리를 수행합니다.tag소유물

@objc func buttonClicked(sender:UIButton)
{
    if(sender.tag == 5){

        var abc = "argOne" //Do something for tag 5
    }
    print("hello")
}

indexPath 또는 urlString과 같은 추가 파라미터를 Clicked 메서드로 전송하려면 UIButton을 하위 분류할 수 있습니다.

class SubclassedUIButton: UIButton {
    var indexPath: Int?
    var urlString: String?
}

ID 검사기의 단추 클래스를 하위 분류로 변경해야 합니다.UI 버튼.버튼 내부의 파라미터에 액세스할 수 있습니다.클릭된 방법은sender.indexPath또는sender.urlString.

참고: 버튼이 셀 내부에 있는 경우 셀ForRowAt에서 이러한 추가 파라미터의 값을 설정할 수 있습니다.단추가 생성되는 IndexPath 메서드입니다.

모두가 태그를 사용하라고 하는 것은 고맙지만, 정말로 UIButton 클래스를 확장하고 거기에 객체를 추가하면 됩니다.

태그는 이것을 피할 수 없는 방법입니다.UI 버튼을 이렇게 확장합니다(Swift 4의 경우).

import UIKit
class PassableUIButton: UIButton{
    var params: Dictionary<String, Any>
    override init(frame: CGRect) {
        self.params = [:]
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        self.params = [:]
        super.init(coder: aDecoder)
    }
}

그런 다음 전화를 걸 수 있습니다(콜론 ":" 참조).Selector(("webButtonTouched:")))

let webButton = PassableUIButton(frame: CGRect(x:310, y:40, width:40, height:40))
webButton.setTitle("Visit",for: .normal)
webButton.addTarget(self, action: #selector(YourViewController.webButtonTouched(_:)), for:.touchUpInside)
webButton.params["myvalue"] = "bob"

그리고 마침내 여기서 모든 것을 잡습니다.

@IBAction func webButtonTouched(_ sender: PassableUIButton) {
    print(sender.params["myvalue"] ?? "")
}

이 작업을 한 번만 수행하면 프로젝트 전체에 사용할 수 있습니다. 하위 클래스에 일반적인 "개체"를 지정하고 원하는 것을 단추에 넣을 수도 있습니다.또는 위의 예를 사용하여 버튼에 무한한 수의 키/문자열 파라미터를 입력합니다.URL, 메시지 방법 확인 등을 포함하는 데 매우 유용합니다.

차치하고, 중요한 건SO커뮤니티는 이것이 전체 세대의 나쁜 관행이 인터넷에서 이해하지 못하는/교육을 받지 못한/이해하지 못하는/이해하지 못하는 수많은 프로그래머들에 의해 차단되고 있다는 것을 인식합니다.object extensions

Swift 3.0의 경우 다음을 사용할 수 있습니다.

button.addTarget(self, action: #selector(YourViewController.YourMethodName(_:)), for:.touchUpInside)

func YourMethodName(_ sender : UIButton) {
    print(sender.tag)

}

스위프트 4.2

결과:

testButton.on(.touchUpInside) { (sender, event) in
    // You can use any reference initialized before the code block here
    // You can access self by adding [weak self] before (sender, event)
    // You can then either make self strong by using a guard statement or use a optional operator (?)
    print("user did press test button")
}

파일에서UIButton+Events.swift에 대한 확장 방법을 만들었습니다.UIButton구속력이 있는UIControl.Event라고 하는 완료 핸들러에EventHandler:

import UIKit

fileprivate var bindedEvents: [UIButton:EventBinder] = [:]

fileprivate class EventBinder {

    let event: UIControl.Event
    let button: UIButton
    let handler: UIButton.EventHandler
    let selector: Selector

    required init(
        _ event: UIControl.Event,
        on button: UIButton,
        withHandler handler: @escaping UIButton.EventHandler
    ) {
        self.event = event
        self.button = button
        self.handler = handler
        self.selector = #selector(performEvent(on:ofType:))
        button.addTarget(self, action: self.selector, for: event)
    }

    deinit {
        button.removeTarget(self, action: selector, for: event)
        if let index = bindedEvents.index(forKey: button) {
            bindedEvents.remove(at: index)
        }
    }
}

private extension EventBinder {

    @objc func performEvent(on sender: UIButton, ofType event: UIControl.Event) {
        handler(sender, event)
    }
}

extension UIButton {

    typealias EventHandler = (UIButton, UIControl.Event) -> Void

    func on(_ event: UIControl.Event, handler: @escaping EventHandler) {
        bindedEvents[self] = EventBinder(event, on: self, withHandler: handler)
    }
}

이벤트 바인딩에 사용자 지정 클래스를 사용한 이유는 버튼이 초기화되지 않았을 때 나중에 참조를 삭제할 수 있기 때문입니다.이렇게 하면 메모리 누수가 발생할 수 있습니다.이것은 그 안에서 가능하지 않았습니다.UIButton그것의 확장, 왜냐하면 나는 부동산을 구현하는 것이 허용되지 않기 때문이다.deinit방법.

만약 당신이 나와 같은 버튼의 루프를 가지고 있다면 당신은 이것과 같은 것을 시도할 수 있습니다.

var buttonTags:[Int:String]? // can be [Int:Any]
let myArray = [0:"a",1:"b"]
for (index,value) in myArray {

     let button = // Create a button

     buttonTags?[index] = myArray[index]
     button.tag = index
     button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchDown)

}
@objc func buttonAction(_ sender:UIButton) {

    let myString = buttonTags[sender.tag]

}

Swift 4.0 코드(다시 시작합니다)

호출된 동작은 목적어 c 언어로 함수를 내보내기 위한 swift 함수의 구문이기 때문에 이렇게 표시되어야 합니다.

@objc func deleteAction(sender: UIButton) {
}

일부 작동 단추 만들기:

let deleteButton = UIButton(type: .roundedRect)
deleteButton.setTitle("Delete", for: [])
deleteButton.addTarget(self, action: #selector( 
MyController.deleteAction(sender:)), for: .touchUpInside)

스위프트 5.0 코드

저는 Button.tag를 사용하지만 옵션 유형이 많다면 매우 긴 스위치 케이스입니다.

theButton.addTarget(self, action: #selector(theFunc), for: .touchUpInside) 
theButton.frame.name = "myParameter"

.

@objc func theFunc(sender:UIButton){ 
print(sender.frame.name)
}

이것은 더 중요한 논평입니다.즉시 사용할 수 있는 sytanx 참조 공유.해킹 솔루션의 경우 다른 답변을 참조하십시오.

Apple 문서에 따르면 작업 방법 정의는 이 세 가지 중 하나여야 합니다.다른 것은 허용되지 않습니다.

@IBAction func doSomething()
@IBAction func doSomething(sender: UIButton)
@IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)

Swift 2.X 이상의 경우

button.addTarget(self,action:#selector(YourControllerName.buttonClicked(_:)),
                         forControlEvents:.TouchUpInside)

스위프트 3.0 코드

self.timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector:#selector(fetchAutocompletePlaces(timer:)), userInfo:[textView.text], repeats: true)

func fetchAutocompletePlaces(timer : Timer) {

  let keyword = timer.userInfo
}

'userinfo'에서 값을 보내고 함수에서 매개 변수로 사용할 수 있습니다.

button.tag = indexPath.row
button.addTarget(self, action: "buttonClicked:", 
    forControlEvents: UIControlEvents.TouchUpInside)
cell.accessoryView = button;

버튼 태그는 어레이/사전에서 전용 레코드를 검색하는 데 도움이 될 수 있습니다.

제안하는 는 없지만 (With 방사매로전를수수없달지만는지할정변개제자는안용식하으사▁the▁although(지)▁parameter)addTarget), 를 사용할 수 있습니다.addAction여기서 원하는 매개 변수를 사용하여 다른 함수를 호출할 수 있습니다.

let btnAuto = UIButton(type: .system)
    btnAuto.frame = CGRect(x:0, y:0 , width:200, height:20)
    btnAuto.backgroundColor = .blue
    btnAuto.addAction(
        UIAction { _ in
            print("This gets printed when the button is pressed")
            dothis(param1, param2)
        }, for: .touchUpInside)
    self.view.addSubview(btnAuto)

이 기능은 일련의 버튼을 프로그래밍 방식으로 생성하고 각 버튼이 다른 작업을 수행하도록 할 때 특히 유용합니다.

과잉 살상일지도 모르지만 프로토콜을 사용할 수는 없나요?그러면 적합한 클래스 내의 속성에 액세스할 수 있어야 하므로 매개 변수를 전달할 필요가 없습니다.

protocol ButtonActionDelegate {
      func buttonClicked()
}

class SomeClassWithSomeButton: ButtonActionDelegate {
      let button = UIButton
      button.addTarget(self, action: "buttonClicked", forControlEvents: UIControlEvents.TouchUpInside)

      func buttonClicked() {
           //Do specific action
          }
}

언급URL : https://stackoverflow.com/questions/24814646/attach-parameter-to-button-addtarget-action-in-swift