如何在目标 C 中通过 @selector 函数传递参数?

How to pass a parameter by a @selector function in Objective C?

提问人:DukeDu 提问时间:12/18/2020 最后编辑:DukeDu 更新时间:12/21/2020 访问量:314

问:

- (IBAction)alertShow:(NSButton *)sender {
    
    MHAlert* alert = [[MHAlert alloc]initWithMessageTitle:@"message" infoText:@"infoText" btnTitle:@"OK" target:self action:@selector(test:) secondBtnTitle:nil target:nil action:nil];
    [alert runModal];
}

- (void)test:(void(^)(BOOL isSuccess))handler
{
    if (handler) {
        handler(YES);
    }
    else
    {
        handler(NO);
    }
    
}

我想通过 @selector(test:) 传递一个参数,这是一个块类型参数, 我检查了test:方法中的处理程序,发现它不是,当我按照代码显示时。 如果没有,我怎样才能将 nil 值传递给 test: 方法。

我不想使用 perform: 方法,或者在网上搜索后包装 mew 方法。

iOS Objective-C macOS Cocoa-Touch

评论

0赞 hacker_1989 12/18/2020
试试这个: stackoverflow.com/a/1018838/4525734
0赞 Paulw11 12/18/2020
什么?它是否使用参数调用提供的选择器?不能在调用中传递参数;这不是工作方式。MHAlertinitWithMessageTitle@selector
0赞 Cy-4AH 12/18/2020
您可以使用 .填写并致电NSInvocationinvoke
0赞 Cy-4AH 12/18/2020
你能解释一下为什么你不想使用吗?perform:withObject:
0赞 skaak 12/18/2020
您可以将 block 参数转换为 并完全按照@hacker_1989所示的示例传递该参数。id

答:

2赞 DukeDu 12/21/2020 #1

在 initWithMessageTitle 实现中使用带有参数启动的 NSInvocation,然后调用。

- (instancetype)initWithMessageTitle:(NSString *)message infoText:(NSString *)info btnTitle:(NSString *)title target:(id)target action:(SEL)action secondBtnTitle:(NSString *)secondTitle target:(id)secondTarget action:(SEL)secondAction
{
     NSMethodSignature *sig = [[target class] instanceMethodSignatureForSelector:action];
     NSInvocation* invoc = [NSInvocation invocationWithMethodSignature:sig];
     //[invoc setArgument: atIndex:2];
     invoc.selector = action;
     [invoc invokeWithTarget:target];
}

填写它并调用受 Cy-4AH 启发的调用。