매개 변수를 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
'programing' 카테고리의 다른 글
C++에서 문자열 스트림에서 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.08.02 |
---|---|
jQuery를 사용하여 테이블 셀 값을 가져오는 방법은 무엇입니까? (0) | 2023.08.02 |
Spring Boot 웹 소켓(StoppSession)이 있는 Django 채널이 작동하지 않음 (0) | 2023.08.02 |
문자열을 이진으로 변환한 다음 PHP를 사용하여 다시 변환 (0) | 2023.08.02 |
sql의 union 절 (0) | 2023.08.02 |