How can I create my own methods which take a block as an argument and which I can call later?

后端 未结 2 1969
孤独总比滥情好
孤独总比滥情好 2020-12-09 12:10

How can I create my own methods which take a block as an argument and which I can call later?

I have tried following things.

#import 

        
相关标签:
2条回答
  • 2020-12-09 12:20

    First the typedef is off if you want to let your blocks take a string parameter:

    typedef void (^viewCreator)(NSString*);
    

    Secondly the type for blocks is:

    ReturnType (^)(ParameterTypes...)
    

    and not

    ReturnType (^*)(ParameterTypes...)
    

    Thus there is no need to add pointers to the viewCreator type:

    - (void)createButtonUsingBlocks:(viewCreator)block;
    

    Third you actually have to call the block if you are not doing that yet:

    -(void)createButtonUsingBlocks:(viewCreator *)block {
        block(@"button name");
        // ...
    

    Fourth and last, the UIButton is over-retained - you should release or autorelease it:

    UIButton *dummyButton = [[UIButton alloc] initWithFrame:...];
    // ...    
    [self.view addSubview:dummyButton];
    [dummyButton release];
    

    Throwing all that together:

    #import <UIKit/UIKit.h>
    typedef void (^viewCreator)(NSString*);
    
    @interface blocks2ViewController : UIViewController {}
    -(void)createButtonUsingBlocks:(viewCreator)block;      
    @end
    
    @implementation blocks2ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];  
        [self createButtonUsingBlocks:^(NSString *name) {
            UIButton *dummyButton = 
                [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 200, 100)];
            dummyButton.backgroundColor = [UIColor greenColor];
            [self.view addSubview:dummyButton];
            [dummyButton release];
        }];
    }
    
    -(void)createButtonUsingBlocks:(viewCreator)block {
        block(@"my button name");
    }
    @end
    
    0 讨论(0)
  • 2020-12-09 12:35

    You can also do it this way without pre-defining the method:

    @interface blocks2ViewController : UIViewController
    -(void)createButtonUsingBlocks:(void (^)(NSString *name))block;
    @end
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self createButtonUsingBlocks:^(NSString * name) {
            UIButton *dummyButton = [[UIButton alloc]initWithFrame:CGRectMake(50, 50, 200, 100)];
            dummyButton.backgroundColor = [UIColor greenColor];
            [self.view addSubview:dummyButton];
        }];
    }
    
    -(void)createButtonUsingBlocks:(void (^)(NSString *name))block
    {
        block(@"My Name Here");
    }
    
    0 讨论(0)
自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题