2012-12-29 17 views
13

Chcę podnieść inną metodę dla każdego utworzonego przycisku. Próbuję wywołać metodę "FirstImage" w viewDidLoad, ale to nie działa.selektor jako parametr w IOS

Mam problem z selektorem w ViewDidLoad. Nie rozpoznałem "FirstImage", który jest metodą void bez parametru.

ViewController.m

- (void)createFirstButton:(NSString *)myName: (SEL *)myAction{ 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn  addTarget:self 
       action:@selector(myAction) 
       forControlEvents:UIControlEventTouchUpInside]; 
    [btn setTitle:myName forState:UIControlStateNormal]; 
    btn.frame = CGRectMake(20, 916, 120, 68); 
    [self.view addSubview:btn]; 
} 

- (void)viewDidLoad{ 
    [self createFirstButton:@"First" myAction:[self FirstImage]]; 
} 

Co mam zrobić (zmieniłem "CreateFirstButton" na "CreateButton"):

ViewControler.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize myHeight; 
@synthesize myWidth; 
@synthesize myX; 
@synthesize myY; 

- (void)createButton:(NSString *)myName:(SEL)myAction:(NSUInteger)my_x:(NSUInteger)my_y:(NSUInteger)my_width:(NSUInteger)my_height 
{ 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn addTarget:self 
      action:myAction 
      forControlEvents:UIControlEventTouchUpInside]; 
    [btn setTitle:myName forState:UIControlStateNormal]; 
    btn.frame = CGRectMake(my_x, my_y, my_width, my_height); 
    [self.view addSubview:btn]; 
} 

- (void)myXcrementation{ 
    myX = myX + 150; 
} 

- (void)viewDidLoad{ 
    myX = 20; myY = 916; myWidth = 120; myHeight = 68; 
    [self createButton:@"First":@selector(FirstImage):myX:myY:myWidth:myHeight]; 
    [self myXcrementation]; 
    [self createButton:@"Previous":@selector(PreviousImage):myX:myY:myWidth:myHeight]; 
    [self myXcrementation]; 
    [self createButton:@"Pause":@selector(PauseImage):myX:myY:myWidth:myHeight]; 
    [self myXcrementation]; 
    [self createButton:@"Next":@selector(NextImage):myX:myY:myWidth:myHeight]; 
    [self myXcrementation]; 
    [self createButton:@"Last":@selector(LastImage):myX:myY:myWidth:myHeight]; 
} 

- (void)FirstImage{ 
    current = 0; 
    [self SetImage]; 
} 

-(void)SetImage{ 
    [myImageView setImage: [myArray objectAtIndex:(current)]]; 
} 

@end 

ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController{ 
} 

@property(assign, nonatomic) NSUInteger myHeight; 
@property(assign, nonatomic) NSUInteger myWidth; 
@property(assign, nonatomic) NSUInteger myX; 
@property(assign, nonatomic) NSUInteger myY; 

@end 

Poprawiłem ten post ponownie i nie ma więcej błędów. Specjalne podziękowania dla wszystkich. Zajęło mi trochę czasu, aby zrozumieć :)

+0

Zastanawiam się - wszystkie przyciski mają tę samą ramkę? –

+3

A także zawiesi się z 'Nierozpoznanym selektorem', ponieważ wiadomość, którą implementujesz, nazywa się' createFirstButton :: ', a nie' createFirstButton: myAction: '. Co więcej, nie potrzebujesz 'SEL *' (podobnie jak "id"): 'SEL' jest wystarczający. Ponadto '@selector (myAction)' nie robi tego, co uważasz za stosowne, użyj po prostu 'myAction' na swoim miejscu. –

Odpowiedz

22

Musisz użyć wykorzystanie @selector następująco

[self createFirstButton:@"First" myAction:@selector(FirstImage)]; 

Wtedy twój podpis jest nieprawidłowy, ponieważ SEL nie powinien być wskaźnik.

Zmień

- (void)createFirstButton:(NSString *)myName: (SEL *)myAction{ 

do

- (void)createFirstButton:(NSString *)myName: (SEL)myAction{ 

Wreszcie myAction ma typ SEL więc można przejść bezpośrednio do sposobu UIButton, co następuje

[btn addTarget:self 
    action:myAction 
    forControlEvents:UIControlEventTouchUpInside]; 

Również ja lubię dodać, że używając wielkich liter dla m etody to bardzo zła praktyka.

+0

Niestety, jestem nowy na iOS. Zrobiłem zbyt wiele błędów. Próbuję to poprawić. –

+1

nie żałuj, całkiem dobrze jest popełniać błędy przy zbliżaniu się do nowego języka/frameworku;) Napraw wszystko, co wskazałem i powinieneś być w porządku. –

+0

Jeśli metoda FirstImage ma argumenty, to nie zadziała. Na przykład możemy chcieć zidentyfikować przycisk, z którego pochodzi żądanie, takie jak identyfikator nadawcy tej metody. Jakieś pomysły, jak to zmienić, aby dostosować metody do argumentów? –

3

Należy użyć

- (void)viewDidLoad{ 
    [self createFirstButton:@"First" myAction:@selector(FirstImage)]; 
} 

lub

- (void)viewDidLoad{ 
    [self createFirstButton:@"First" myAction:NSSelectorFromString(@"FirstImage")]; 
} 

@selector(myAction) należy zastąpić myAction i (SEL *) należy zastąpić SEL.

W swoim kodzie, przed wywołaniem -createFirstButton:myAction:, jego drugi parametr [self FirstImage] zostanie oceniony (wywołany) jako pierwszy. @selector() pobiera nazwę i zwraca SEL.

+0

Dziękuję za pomoc, ale nadal mam tę wiadomość: Brak widocznego interfejsu @ dla "ViewController" deklaruje selektor "createFirstButton: myAction: ' –

+0

@ icewall0, powinieneś zadeklarować' - (void) createFirstButton: (NSString *) myName myAction: (SEL) myAction; 'pomiędzy' @interface ViewController' i '@ end' w pliku nagłówkowym, jeśli powinno być widoczne jako publiczna metoda lub pomiędzy' @interface ViewController() 'i' @ end' przed '@ implementation' jako metoda prywatna. – ZhangChn

0

Zastosowanie

[self createFirstButton:@"First" withAction:NSSelectorFromString(@"FirstImage")]; 

i zmienić nazwę metody jak:

- (void)createFirstButton:(NSString *)myName: withAction: (SEL) myAction{ 
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn  addTarget:self 
       action:myAction 
       forControlEvents:UIControlEventTouchUpInside]; 
    [btn setTitle:myName forState:UIControlStateNormal]; 
    btn.frame = CGRectMake(20, 916, 120, 68); 
    [self.view addSubview:btn]; 
} 

Również

Zastanawiam-wszystkie przyciski posiadające tę samą ramkę, jeśli to możliwe towarzysza frame tej metody.

+1

Niepoprawnie. 'SEL' nie powinien być wskaźnikiem. –

+0

Zaktualizowany, dzięki :) –

+0

updated.everything. :) –

0

Zmiana metody dosłowne jak w poniższym

- (void)createFirstButton: (NSString *)myName withAction: (SEL)myAction 

dla obu deklaracji i definicji.

A także dlaczego zadeklarowałeś tę samą metodę, zarówno publiczną, jak i prywatną?

+0

Budynek się powiódł, ale nadal się rozbiłam, gdy naciskałam przycisk FirstButton. Za dużo pracowałem nad tym kodem, jestem zmęczony, przepraszam –

+0

Jaka wiadomość pojawia się w dzienniku po naciśnięciu przycisku podczas awarii? – Exploring

0

Jeśli chcesz przekazać ciąg jako nazwę metody do selektora, użyj NSSelectorFromString. Łańcuch powinien kończyć się na ":" Przykład:

NSString *[email protected]"aMethod:"; 
    [button addTarget:self 
       action:NSSelectorFromString(myName) 
    forControlEvents:UIControlEventTouchDown];