매개 변수 전달을 통한 추가Target:action:ControlEvents
다음과 같은 ControlEvents에 대해 addTarget:action:action을 사용합니다.
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
선택한 "switchToNewsDetails"에 매개 변수를 전달하고 싶습니다.제가 성공한 유일한 방법은 (ID) 보낸 사람을 다음과 같이 쓰는 것입니다.
action:@selector(switchToNewsDetails:)
하지만 저는 정수값과 같은 변수를 전달하려고 노력하고 있습니다.이런 식으로 쓰는 것은 효과가 없습니다.
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
이러한 방식으로 작성해도 작동하지 않습니다.
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
어떤 도움이든 감사하겠습니다 :)
action:@selector(switchToNewsDetails:)
사용자는 매개 를 매변수에않습니다지전에 .switchToNewsDetails:
여기에 있는 방법.선택기를 만들어 특정 작업이 발생할 때 버튼을 호출할 수 있도록 합니다(해당 경우 터치업).컨트롤은 세 가지 유형의 선택기를 사용하여 작업에 응답할 수 있으며, 모든 선택기에는 매개 변수의 사전 정의된 의미가 있습니다.
매개 변수 없이
action:@selector(switchToNewsDetails)
메시지를 보내는 컨트롤을 나타내는 매개 변수 1개로
action:@selector(switchToNewsDetails:)
메시지를 보내는 컨트롤과 메시지를 트리거한 이벤트를 나타내는 2개의 파라미터:
action:@selector(switchToNewsDetails:event:)
정확히 무엇을 하려고 하는지는 분명하지 않지만 각 버튼에 특정 세부 정보 인덱스를 할당하려는 경우 다음 작업을 수행할 수 있습니다.
- 각 버튼에 태그 속성을 필수 인덱스와 동일하게 설정
switchToNewsDetails:
방법 해당 인덱스를 가져오고 적절한 세부 정보를 열 수 있습니다.- (void)switchToNewsDetails:(UIButton*)sender{ [self openDetails:sender.tag]; // Or place opening logic right here }
버튼 클릭과 함께 사용자 정의 파라미터를 전달하려면 SubCLASS UI 버튼을 클릭하기만 하면 됩니다.
(ASR이 켜져 있어서 코드에 릴리스가 없습니다.)
이것은 나의 단추입니다.
#import <UIKit/UIKit.h>
@interface myButton : UIButton {
id userData;
}
@property (nonatomic, readwrite, retain) id userData;
@end
이것은 나의 단추입니다.
#import "myButton.h"
@implementation myButton
@synthesize userData;
@end
용도:
myButton *bt = [myButton buttonWithType:UIButtonTypeCustom];
[bt setFrame:CGRectMake(0,0, 100, 100)];
[bt setExclusiveTouch:NO];
[bt setUserData:**(insert user data here)**];
[bt addTarget:self action:@selector(touchUpHandler:) forControlEvents:UIControlEventTouchUpInside];
[view addSubview:bt];
수신 기능:
- (void) touchUpHandler:(myButton *)sender {
id userData = sender.userData;
}
위 코드의 어떤 부분에 대해 좀 더 구체적으로 설명해야 한다면 언제든지 의견으로 문의하십시오.
단순한 (int) via .tag 이상이 필요합니까?KVC 사용!
CALayers keyValue dict에 액세스하여 버튼 개체 자체를 통해 원하는 모든 데이터를 전달할 수 있습니다.
목표값을 이렇게 설정합니다(":" 사용).
[myButton addTarget:self action:@selector(buttonTap:) forControlEvents:UIControlEventTouchUpInside];
자체에 the 버자에데추가니합다를터이체)..layer
다음과 같은 버튼:
NSString *dataIWantToPass = @"this is my data";//can be anything, doesn't have to be NSString
[myButton.layer setValue:dataIWantToPass forKey:@"anyKey"];//you can set as many of these as you'd like too!
*참고: 키는 CALayer 속성의 기본 키가 아니어야 합니다. 키 충돌로 인한 문제를 방지하기 위해 모든 키에 고유 접두사를 추가하는 것이 좋습니다.
그런 다음 버튼을 누르면 다음과 같이 확인할 수 있습니다.
-(void)buttonTap:(UIButton*)sender{
NSString *dataThatWasPassed = (NSString *)[sender.layer valueForKey:@"anyKey"];
NSLog(@"My passed-thru data was: %@", dataThatWasPassed);
}
Target-Action에서는 세 가지 다른 형태의 작업 선택기를 사용할 수 있습니다.
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event
위의 정보를 바탕으로 부분적으로 해결책을 만들었습니다.제목 라벨만 설정했습니다.전달할 문자열에 텍스트를 입력하고 제목 레이블을 설정합니다.숨김 = YES
다음과 같이:
UIButton *imageclick = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
imageclick.frame = photoframe;
imageclick.titleLabel.text = [NSString stringWithFormat:@"%@.%@", ti.mediaImage, ti.mediaExtension];
imageclick.titleLabel.hidden = YES;
이렇게 하면 상속이나 범주가 필요하지 않으며 메모리 누수도 없습니다.
저는 배열에 있는 각 전화 번호에 대해 여러 개의 단추를 만들고 있었기 때문에 각 단추에 호출할 다른 전화 번호가 필요했습니다.for 루프 내에 여러 개의 버튼을 만들 때 setTag 기능을 사용했습니다.
for (NSInteger i = 0; i < _phoneNumbers.count; i++) {
UIButton *phoneButton = [[UIButton alloc] initWithFrame:someFrame];
[phoneButton setTitle:_phoneNumbers[i] forState:UIControlStateNormal];
[phoneButton setTag:i];
[phoneButton addTarget:self
action:@selector(call:)
forControlEvents:UIControlEventTouchUpInside];
}
그런 다음 내 전화에서 나는 루프와 if 문에 동일한 것을 사용하여 올바른 전화 번호를 선택했습니다.
- (void)call:(UIButton *)sender
{
for (NSInteger i = 0; i < _phoneNumbers.count; i++) {
if (sender.tag == i) {
NSString *callString = [NSString stringWithFormat:@"telprompt://%@", _phoneNumbers[i]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]];
}
}
}
솔루션에는 여러 가지 방법이 있으므로 범주 기능을 제외합니다.
범주 기능을 사용하여 정의된(기본 제공) 요소를 사용자 지정 가능한 요소로 확장할 수 있습니다.
예를 들어 (ex):
@interface UIButton (myData)
@property (strong, nonatomic) id btnData;
@end
사용자가 보기에 Controller.m
#import "UIButton+myAppLists.h"
UIButton *myButton = // btn intialisation....
[myButton set btnData:@"my own Data"];
[myButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
이벤트 처리기:
-(void)buttonClicked : (UIButton*)sender{
NSLog(@"my Data %@", sender. btnData);
}
도우미 폐쇄 래퍼(ClosureSleeve)를 추가하고 이를 컨트롤에 연결 개체로 추가하여 유지되도록 대상 액션을 폐쇄(Objective-C의 블록)로 바꿀 수 있습니다.그러면 모든 매개 변수를 전달할 수 있습니다.
스위프트 3
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 addAction(for controlEvents: UIControlEvents, action: @escaping () -> ()) {
let sleeve = ClosureSleeve(attachTo: self, closure: action)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
}
}
용도:
button.addAction(for: .touchUpInside) {
self.switchToNewsDetails(parameter: i)
}
버튼을 누른 셀의 indexPath를 가져올 수 있는 다른 방법이 있습니다.
다음과 같은 일반 작업 선택기 사용:
UIButton *btn = ....;
[btn addTarget:self action:@selector(yourFunction:) forControlEvents:UIControlEventTouchUpInside];
그리고 나서 당신의 기능:
- (void) yourFunction:(id)sender {
UIButton *button = sender;
CGPoint center = button.center;
CGPoint rootViewPoint = [button.superview convertPoint:center toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rootViewPoint];
//the rest of your code goes here
..
}
indexPath를 얻을 수 있기 때문에 훨씬 더 단순해졌습니다.
위의 내 의견을 참조하십시오. 매개 변수가 두 개 이상일 때 NSInvocation을 사용해야 합니다.
NSInvocation에 대한 자세한 내용은 여기를 참조하십시오.
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
이것은 나의 문제를 해결했지만 내가 바꾸지 않는 한 충돌했습니다.
action:@selector(switchToNewsDetails:event:)
로.
action:@selector(switchToNewsDetails: forEvent:)
CustomButton에서 UIButton을 하위 분류하고 데이터를 저장하는 속성을 추가합니다.그래서 저는 method: (CustomButton*) sender를 호출하고 method에서는 제 data sender.myproperty만 읽습니다.
사용자 지정 단추 예제:
@interface CustomButton : UIButton
@property(nonatomic, retain) NSString *textShare;
@end
메서드 작업:
+ (void) share: (CustomButton*) sender
{
NSString *text = sender.textShare;
//your work…
}
작업 할당
CustomButton *btn = [[CustomButton alloc] initWithFrame: CGRectMake(margin, margin, 60, 60)];
// other setup…
btnWa.textShare = @"my text";
[btn addTarget: self action: @selector(shareWhatsapp:) forControlEvents: UIControlEventTouchUpInside];
탐색 컨트롤러에 표시된 왼쪽 BarButtonItem의 텍스트를 새 보기와 함께 변경하려는 경우, pushViewController를 원하는 텍스트로 호출하기 직전에 현재 보기의 제목을 변경하고 현재 보기의 향후 표시를 위해 HasDisappared 콜백 보기에서 복원할 수 있습니다.
이 접근 방식은 표시된 화살표의 기능(popViewController)과 모양을 그대로 유지합니다.
적어도 Xcode 10.1로 구축된 iOS 12에서는 작동합니다.
언급URL : https://stackoverflow.com/questions/3988485/passing-parameters-to-addtargetactionforcontrolevents
'programing' 카테고리의 다른 글
현재 시간을 날짜 시간으로 가져오는 방법 (0) | 2023.07.08 |
---|---|
vue.jest unit - 계산된 값을 기반으로 Watcher를 테스트하는 방법? (setComputed는 더 이상 사용되지 않습니다.) (0) | 2023.07.08 |
SQL Server 쿼리에서 데이터 정렬 충돌을 해결하는 방법은 무엇입니까? (0) | 2023.07.08 |
ASP.NET ID 재설정 암호 (0) | 2023.07.08 |
Firebase Analytics 사용자 지정 이벤트 매개 변수 (0) | 2023.07.08 |