2012-12-29 12 views
13

Desidero generare un metodo diverso per ogni pulsante creato. Provo a chiamare il metodo "FirstImage" in viewDidLoad ma non funziona.come parametro in IOS

Ho un problema con il selettore in ViewDidLoad. Non ha riconosciuto "FirstImage" che è un metodo void senza parametro.

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]]; 
} 

Quello che ho fatto (ho cambiato "CreateFirstButton" in "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 

Ho modificato questo post di nuovo e non ci sono più errori. Un grazie speciale a tutti. Mi ha preso tempo per capire :)

+0

Mi chiedo-tutti i pulsanti con lo stesso frame? –

+3

E si bloccherà anche con 'Selettore non riconosciuto', poiché il messaggio che stai implementando si chiama' createFirstButton :: 'e non' createFirstButton: myAction: '. Inoltre, non hai bisogno di 'SEL *' (similmente a 'id'):' SEL' è sufficiente. Inoltre, '@selector (myAction)' non fa quello che tu pensi che faccia, usa semplicemente 'myAction' al suo posto. –

risposta

22

Devi usare l'uso @selector come segue

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

Allora la tua firma è sbagliato, in quanto SEL non dovrebbe essere un puntatore.

Change

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

a

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

Infine myAction è di tipo SEL in modo da poter passare direttamente al metodo UIButton, come segue

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

Inoltre, mi piacerebbe piace aggiungere che usando nomi in maiuscolo per m ethods è una pessima pratica.

+0

Scusa se sono nuovo per iOS Ho fatto troppi errori. Provo a correggerlo. –

+1

non essere dispiaciuto, è perfettamente corretto commettere errori quando ci si avvicina a un nuovo linguaggio/framework;) Risolve tutto ciò che ho indicato e dovresti essere ok. –

+0

Se il metodo FirstImage ha argomenti, questo non funzionerà. Ad esempio, potremmo voler identificare il pulsante da cui proviene la richiesta come l'id del mittente di quel metodo. Qualche idea su come cambiarlo per adattarsi ai metodi con argomenti? –

3

Si dovrebbe usare

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

o

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

@selector(myAction) dovrebbe essere sostituito con myAction e (SEL *) dovrebbe essere sostituito con SEL.

Nel codice, prima che venga chiamato -createFirstButton:myAction:, il suo secondo parametro verrà valutato (chiamato) per primo. @selector() prende un nome e restituisce un SEL.

+0

Grazie per il vostro aiuto ma ho ancora ricevuto questo messaggio: Nessuna interfaccia @ visibile per 'ViewController' dichiara il selettore 'createFirstButton: myAction:' –

+0

@ icewall0, è necessario dichiarare '- (void) createFirstButton: (NSString *) myName myAction: (SEL) myAction; 'tra' @interface ViewController' e '@ end' nel suo file di intestazione se deve essere esposto come metodo pubblico o tra' @interface ViewController() 'e' @ end' prima '@ implementation' come metodo privato. – ZhangChn

0

Usa

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

e cambiare il nome del metodo come:

- (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]; 
} 

Inoltre,

mi chiedo-tutti i pulsanti hanno lo stesso telaio, se possibile passaggio frame questo metodo.

+1

Sbagliato. 'SEL' non dovrebbe essere un puntatore. –

+0

Aggiornato, grazie :) –

+0

aggiornato.Tutto. :) –

0

modificare il metodo letterale come nel seguente

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

Sia per la dichiarazione e la definizione.

E anche perché hai dichiarato lo stesso metodo di pubblico e privato?

+0

La costruzione è riuscita, ma continuo a verificarsi un arresto anomalo quando premo il mio FirstButton. Ho lavorato troppo su questo pezzo di codice Sono stanco scusa –

+0

Che messaggio ricevi sul registro dopo aver premuto il pulsante mentre si è bloccato? – Exploring

0

Se si desidera passare la stringa come nome del metodo al selettore, utilizzare NSSelectorFromString. La stringa dovrebbe terminare con ':' Esempio-

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