2011-02-10 9 views
12

Właśnie zaczyna się rozwój iPhone'a i Objective-C.Kiedy używać dwukropka z @selector

Wczoraj próbowałem addObserver do zawiadomienia w widoku z kopalni, a ja ciągle się ten błąd:

unrecognized selector sent to instance

I śledzone w dół na fakt, że muszę zawierać tyłu dwukropek do mojego Argument selektor:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil];

Dziś Myślałem, że jestem mądry, ponieważ podczas konfigurowania argument akcji do przycisku, przypomniałem sobie mój błąd wczoraj i dodał okrężnicy do argumentu działania. Argument akcji przyjmuje @selector, podobnie jak argument selektora podczas konfigurowania obserwatora dla NSNotification, więc pomyślałem, że robię to, co trzeba.

Jednak z następującego kodu:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside];

pojawia się dokładnie ten sam błąd:

unrecognized selector sent to instance

Co daje? Dlaczego jeden @selector wymaga końcowego dwukropka, a drugi nie? Jakie zasady należy przestrzegać, kiedy należy je uwzględnić i kiedy należy je wyłączyć, i dlaczego nie mogę zawsze zrobić jedno lub drugie?

Dzięki!

+1

To dwukropek, a nie średnik. W każdym razie, jaki jest prototyp twojej metody 'nameOfMySelector:'? Jakiego argumentu chce? – BoltClock

+0

Czy odnosisz się do tej samej metody w obu przypadkach? – BoltClock

+0

Ha! Przeoczenie z mojej strony; Zmieniłem post, aby określić je jako dwukropek. – djibouti33

Odpowiedz

29

Jak wspomniano przez boltClock, postać którego się odnosimy jest właściwie dwukropek. Różnica między @selector(method) a @selector(method:) jest sygnaturą metody. Drugi wariant oczekuje podania parametru.

@selector(method) oczekiwać, że metody: -(void)method

@selector(method:) oczekiwać, że metody: -(void)method:(id)someParameter

+3

Idziemy, to jest dokładnie to. Ma całkowity sens. Dziękuję za szybką odpowiedź i lekcję gramatyki :) – djibouti33

8

Wygląda na to, że brakuje tu jednej koncepcji: dwukropek jest w pewnym sensie częścią nazwy metody. Na przykład metoda

-(IBAction) doIt:(id)sender; 

ma nazwę doIt:. Tak więc należy użyć dwukropka, aby odwołać się do tej metody.
Ale ta metoda nie ma dwukropka na końcu

-(IBAction) doItWithoutParameter; 

samo dotyczy metody przyjmując wiele argumentów, mają nazwy takie jak doItWithParam1:andParam2:

2

Okrężnica wskazuje, że metoda ta jest parametr.

[someObject performSelector:@selector(doSomething:)] oznacza, że ​​coś się oczekuje parametru.

[someObject performSelector:@selector(doSomething)] oznacza, że ​​do coś nie wymaga żadnych parametrów.

2

W twoim przypadku:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil]; 

- (void) nameOfMySelector: (NSNotification *) notification { 
    /* this method would require the semi-colon */ 
} 

lub w tym przypadku:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside]; 

- (void) nameOfMySelector: (id) sender { 
    /* this method would also require the semi-colon */ 
} 
5

Selektor reprezentuje nazwę metody, a liczba dwukropkami w selektor dopasowuje liczbę argumentów za pośrednictwem odpowiedniej metody:

  1. mySelector - bez dwukropka, bez argumentów, np - (void)mySelector;, [self mySelector];
  2. mySelectorWithFoo: - jeden dwukropek, pojedynczy argument, np. - (void)mySelectorWithFoo:(Foo *)foo;, [self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar: - dwa dwukropki, dwa argumenty, np. - (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;, [self mySelectorWithFoo:someFoo bar:someBar];

i tak dalej.

Istnieje również możliwość wyboru selektora bez "nazywania" parametrów. Nie jest to zalecane, ponieważ nie jest od razu jasne, jakie są parametry:

  1. mySelector:: - dwa dwukropki, dwa argumenty, np. - (void)mySelector:(Foo *)foo :(Bar *)bar;, [self mySelector:someFoo :someBar];
  2. - trzy dwukropki, trzy argumenty, np. - (void)mySelector:(int)x :(int)y :(int)z;, [self mySelector:2 :3 :5];