Bağımsız değişken olarak bir blok alan ve daha sonra arayabileceğim kendi yöntemlerimi nasıl oluşturabilirim?

bir argüman olarak bir blok alan ve daha sonra arayabileceğim kendi yöntemlerimi nasıl oluşturabilirim?

aşağıdaki şeyleri denedim.

#import <UIKit/UIKit.h>
typedef void (^viewCreator)(void);

@interface blocks2ViewController : UIViewController
{
}
-(void)createButtonUsingBlocks:(viewCreator *)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:(viewCreator *)block
{
    //    Do something
    NSLog(@"inside creator");
}

blok değişkenini özel yöntemime ancak herhangi bir başarı olmadan geçmeye çalıştım. Neden öyle ve bunu yapmanın doğru yolu nedir?


güncelleme

bu dosya is.h :

 #import <UIKit/UIKit.h>

typedef void (^viewCreator)(void);

@interface blocks2ViewController : UIViewController
{

}
- (void)createButtonUsingBlocks:(viewCreator)block;
@end

ve bu .m dosyası:

#import "blocks2ViewController.h"

@implementation blocks2ViewController
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (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)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

// ...

-(void)createButtonUsingBlocks:(viewCreator)block
{
//    viewCreator;
    NSLog(@"inside creator");
}
@end
10
tarihinde sordu Peter Mortensen 2010-09-09 11:12:55
kaynak

2 ответов

ilk typedef , bloklarınızın bir dize parametresi almasına izin vermek isterseniz kapalıdır:

typedef void (^viewCreator)(NSString*);

' blokların türü:

ReturnType (^)(ParameterTypes...)

ve

değil
ReturnType (^*)(ParameterTypes...)

böylece viewCreator türüne işaretçiler eklemek gerek yoktur:

- (void)createButtonUsingBlocks:(viewCreator)block;

üçüncü aslında zorunda Bunu henüz yapmıyorsanız bloğu arayın:

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

dördüncü ve son, UIButton over-retained - release veya autorelease it:

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

' hepsi birlikte:

#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
13
cevap Georg Fritzsche 2010-09-09 12:51:18
kaynak

yöntemi önceden tanımlamadan da bu şekilde yapabilirsiniz:

@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");
}
6
cevap Gujamin 2012-01-11 23:23:02
kaynak

Diğer sorular objective-c cocoa-touch block