我有一个带有两个 View 的简单应用程序:第一个 View 有一个按钮,当您按下它时,您将获得一个到另一个 View 的模式切换。如您所知,带有模态转场的 Controller 没有“后退”按钮,因此您可能会编写委托(delegate)。我想使用 block 来获得更紧凑的代码。首先,我做了以下事情。
在“第二” View Controller 中声明 block :
typedef void (^SecondViewControllerCompletionBlock)(BOOL success);
@interface SecondViewController : UIViewController
@property (nonatomic, copy) SecondViewControllerCompletionBlock CompletionBlock;
我在“完成”按钮的操作中编写了代码(这是 UINavigationController
顶部的按钮):
- (IBAction)doneBarButton:(id)sender {
if (self.CompletionBlock !=nil){
self.CompletionBlock (YES);
}
}
在“第一个” View Controller 中为 segue 做准备:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"ShowDetail"]){
__weak SecondViewController *controller = segue.destinationViewController;
controller.CompletionBlock = ^(BOOL success){
if (NO){
[self dismissViewControllerAnimated:YES completion:nil];
}
};
}
所以,一切正常;我可以通过按完成按钮关闭菜单。但是,如果我在声明 block 时想要 BOOL
以外的东西怎么办?我尝试使用 int
。
声明 block :
typedef void (^SecondViewControllerCompletionBlock)(int success);
@interface SecondViewController : UIViewController
@property (nonatomic, copy) SecondViewControllerCompletionBlock CompletionBlock;
更改 doneBarButtonItem:
操作方法中的代码:
- (IBAction)doneBarButton:(id)sender {
if (self.CompletionBlock !=nil){
self.CompletionBlock (1);
}
}
在这个方法中,当我写一个 if
语句时,我将 2
作为参数放在圆括号中,但是,我的意思是,如果你在这里放除了 1
(我在配置 action 方法时传递的),语句不应该执行,因此, Controller 不应该关闭。但在所有情况下,如果我将 1
放在 if(1)
语句或 2
或其他任何内容中,它都会这样做。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"ShowDetail"]){
__weak SecondViewController *controller = segue.destinationViewController;
controller.CompletionBlock = ^(int success){
if (2){
[self dismissViewControllerAnimated:YES completion:nil];
}
};
}
我可能遗漏了一些明显的东西。你能帮我解决这个问题吗?如果不仅有 BOOL
用于更改操作,那就太好了。
最佳答案
if (2) {
...
}
意义不大。在 C(和 Objective-C)中,任何非零值的计算结果为真,因此您进行的测试大致等同于
if (YES) {
...
}
显然,它总是会过去。
您真正想要的是针对该值测试论证:
controller.CompletionBlock = ^(int success){
if (success == 2){
[self dismissViewControllerAnimated:YES completion:nil];
}
};
最后,风格上的评论:所有变量都应以小写字母开头, block 变量也不异常(exception)。 CompletionBlock
应该命名为 completionBlock
。
关于ios - 正确使用 block 进行两个类之间的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19745654/