W MyClass.m zdefiniowałem
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
oraz odpowiednią deklarację w MyClass.h. Później chcę zadzwonić
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
w MyClass.m, ale pojawia się błąd podobny do * Zakończenie aplikacji z powodu niezłapanego wyjątku „NSInvalidArgumentException”, przyczyna: „* - [MyClass myTest: withAtring:]: nierozpoznany selektor wysłany do instancji 0xe421f0”
Wypróbowałem prostszy przypadek z selektorem, który nie przyjmował żadnych argumentów, który drukował łańcuch do konsoli i działał dobrze. Co jest nie tak z kodem i jak to naprawić? Dzięki.
Odpowiedzi:
Twój podpis metody to:
withAString jest parametrem (nazwa jest myląca, wygląda na to, że jest częścią podpisu selektora).
Jeśli wywołasz funkcję w ten sposób:
To będzie działać.
Ale, jak sugerowały inne plakaty, możesz zmienić nazwę metody:
I zadzwoń:
źródło
W Objective-C podpis selektora składa się z:
Selektory nie mają wiedzy o:
Oto implementacja klasy, w której metoda performMethodsViaSelectors wykonuje inne metody klasy za pomocą selektorów:
Metoda, dla której chcesz utworzyć selektor, ma jedno wejście, więc możesz utworzyć dla niej selektor w następujący sposób:
źródło
@Shane Arney
Możesz również wspomnieć, że ta metoda służy tylko do przekazywania maksymalnie 2 argumentów i nie można jej opóźniać. (np
performSelector:withObject:afterDelay:)
.trochę dziwne, że Apple obsługuje tylko 2 obiekty do wysłania i nie czyni go bardziej ogólnym.
źródło
Twój kod ma dwa problemy. Jeden został zidentyfikowany i odebrany, ale drugi nie. Po pierwsze, w selektorze brakowało nazwy swojego parametru. Jednak nawet jeśli to naprawisz, wiersz nadal będzie zgłaszał wyjątek, zakładając, że poprawiona sygnatura metody nadal zawiera więcej niż jeden argument. Powiedzmy, że Twoja poprawiona metoda jest zadeklarowana jako:
Tworzenie selektorów dla metod, które przyjmują wiele argumentów, jest całkowicie poprawne (np. @Selector (myTestWithString: compareTo :)). Jednak metoda performSelector pozwala tylko na przekazanie jednej wartości do myTest, która niestety ma więcej niż jeden parametr. Wyświetli się błąd i powie Ci, że nie podałeś wystarczającej liczby wartości.
Zawsze możesz przedefiniować swoją metodę, aby pobrać kolekcję, ponieważ jest to jedyny parametr:
Istnieje jednak bardziej eleganckie rozwiązanie (nie wymagające refaktoryzacji). Odpowiedzią jest użycie NSInvocation wraz z jego metodami
setArgument:atIndex:
iinvoke
metodami.Napisałem artykuł, w tym przykład kodu , jeśli chcesz uzyskać więcej informacji. Nacisk kładziony jest na gwintowanie, ale podstawy nadal mają zastosowanie.
Powodzenia!
źródło
Twoja sygnatura metody nie ma sensu, czy na pewno nie jest to literówka? Nie rozumiem, jak to się w ogóle kompiluje, chociaż może otrzymujesz ostrzeżenia, które ignorujesz?
Ile parametrów powinna przyjąć ta metoda?
źródło
Uważam, że klasę należy zdefiniować jako:
Masz tylko jeden parametr, więc powinieneś mieć tylko jeden:
Możesz również rozważyć użycie% @ w swoim dzienniku NSLog - jest to po prostu dobry nawyk - wtedy wypisze dowolny obiekt - nie tylko łańcuchy.
źródło
Dokument Apple mówi, że nie ma dostępnego API dla tej funkcji i niektórych innych oczekiwanych funkcji w niestandardowej klawiaturze. więc musisz znaleźć własną logikę, aby to zaimplementować.
źródło