ios - 正确使用 block 进行两个类之间的回调

标签 ios objective-c objective-c-blocks

我有一个带有两个 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/

相关文章:

ios - Alamofire:使用相同的 key 发送多个 URL 编码参数

ios - 无声推送时如何自动播放音频功能?

ios - 当放置在 TabBarController 中时,按钮会出现在 View 之外,否则不会出现?

android - 当应用程序离开后台并返回 iOS 和 Android 时,WebView 正在重新加载?

objective-c - iPhone SDK中日期的NSTimeinterval问题

c++ - Clang 'blocks' 是如何工作的?

iOS 应用程序在存档后表现不同

ios - 使用自动布局时,UIButton 中的图像不会缩放。

ios - 为什么我不能将我的 opengl FBO 写入 AVAssetWriter?

ios - 如何检查全局调度队列是否为空?