gpt4 book ai didi

ios - 将数组中的闭包/ block 作为参数传递 iOS

转载 作者:行者123 更新时间:2023-11-30 12:24:24 26 4
gpt4 key购买 nike

我试图将数组中的警报操作传递给一个函数,该函数用于将 UIAlertController 配置简化为一行。能够成功传递按钮标题,但不能传递警报操作。这就是我正在做的事情。

+(void)showAlertWithTitle:(NSString*)title 
message:(NSString*)alertmessage
buttonTitles:(NSArray*)buttonTitles
buttonActions:(NSArray*)buttonActions
inViewController:(UIViewController*)viewController {

UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:alertmessage preferredStyle:UIAlertControllerStyleAlert];

[buttonTitles enumerateObjectsUsingBlock:^(NSString* buttonTitle,NSUInteger idx,BOOL *stop){
UIAlertAction *action = [UIAlertAction actionWithTitle:buttonTitle style:UIAlertActionStyleDefault handler: [[buttonActions objectAtIndex:idx] copy]]; //blocks should always be copied to heap from stack else they will crash
[alert addAction:action];
}];

[viewController presentViewController:alert animated:YES completion:nil];

}

上面的代码文件是很久以前写的,所以它在 objective-c 中。我已经编写了一些 swift 中的新文件,并且我正在 swift 中调用上述方法,如下所示。

 CommonManager.showAlert(withTitle: "", message: "Feedback Sent", 
buttonTitles: ["Ok"], buttonActions: [ { (action: UIAlertAction) in

print("you pressed Ok alert button");

// call method whatever u need
}], in: self)

如果我没有通过闭包,它工作正常,如果在单击“确定”时通过闭包,它会崩溃。我还发现,当它作为集合传递时,我们需要复制一个 block ,我这样做了,但有些东西仍然不对,无法弄清楚。你能告诉我我需要在这里做什么吗?

谢谢

最佳答案

问题在于 Swift 闭包是与 Objective-C block 不同类型的对象,因此尝试将其作为 block 运行会崩溃。

通常,如果 Swift 编译器发现您正在将一个闭包传递给带有 block 类型参数的 Objective-C 方法,它会将 Swift 闭包转换为 Objective-C block ,但在这种情况下,它只是看到您是将其放入数组中,而不是该方法将在数组中对其执行什么操作,因此它不会执行任何转换。

我能想出让它工作的唯一方法是这样的:

 CommonManager.showAlert(withTitle: "", message: "Feedback Sent", 
buttonTitles: ["Ok"], buttonActions: [ { (action: UIAlertAction) in

print("you pressed Ok alert button");

// call method whatever u need
} as (@convention(block) (UIAlertAction) -> Void)!], in: self)

关于ios - 将数组中的闭包/ block 作为参数传递 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44372660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com