Czy istnieje sposób wywołania [anObject performSelector]; z więcej niż 2 obiektami? Wiem, że możesz użyć tablicy do przekazania wielu argumentów, ale zastanawiałem się, czy istnieje sposób na niższy poziom wywoływania funkcji, którą już zdefiniowałem z więcej niż 2 argumentami bez użycia funkcji pomocnika z nsarray argumentów.performSelector z więcej niż 2 obiektami
Odpowiedz
Albo (1) Użyj NSInvocation lub (2) bezpośrednio użyj objc_msgSend
.
objc_msgSend(target, @selector(action:::), arg1, arg2, arg3);
(Uwaga: upewnij się, że wszystkie argumenty są id
„s, w przeciwnym razie argumenty nie może zostać wysłany poprawnie.)
można rozszerzyć klasę NSObject
takiego:
- (id) performSelector: (SEL) selector withObject: (id) p1
withObject: (id) p2 withObject: (id) p3
{
NSMethodSignature *sig = [self methodSignatureForSelector:selector];
if (!sig)
return nil;
NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig];
[invo setTarget:self];
[invo setSelector:selector];
[invo setArgument:&p1 atIndex:2];
[invo setArgument:&p2 atIndex:3];
[invo setArgument:&p3 atIndex:4];
[invo invoke];
if (sig.methodReturnLength) {
id anObject;
[invo getReturnValue:&anObject];
return anObject;
}
return nil;
}
(Zobacz NSObjectAdditions z projektu Three20.) Następnie możesz nawet rozszerzyć powyższą metodę, aby użyć varargs i tablicy argumentów zakończonych znakiem Nil, ale to przesada.
Dodatkową opcją, gdy trzeba wysłać wiele obiektów przy pomocy performSelector
jest (jeśli jest to łatwe), aby zmienić metodę, którą chcesz wywołać, aby pobrać obiekt NSDictionary
zamiast wielu parametrów, ponieważ będziesz w stanie wysłać dowolną liczbę osób w słowniku.
Na przykład
miałem sposób podobny do tego, który miał 3 argumenty i musiałem zadzwonić z performSelector -
-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{
zmieniłem tę metodę, aby skorzystać słownika do zapamiętywania argumenty
-(void)getAllDetailsForObject:(NSDictionary*)details{
dlatego udało mi się wywołać metodę łatwo
[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}];
Pomyślałem, że równie dobrze będę mógł to wykorzystać jako alternatywną opcję, która działa dla mnie.
Cheers
- 1. Więcej niż 2 przyciski na sweetalert 2
- 2. pliki std :: fstream więcej niż 2 gb
- 3. Czy można utworzyć projekt gradacji z więcej niż 2 poziomami?
- 4. Jak wykonać LEFT JOIN z więcej niż 2 tabelami?
- 5. Angular 2 Więcej niż jeden składnik na tej samej stronie
- 6. Przeplatanie wiele (więcej niż 2) nieregularne listy przy użyciu LINQ
- 7. Scalanie więcej niż 2 ramek danych w R przez rownames
- 8. Dopasowywanie wzorców z więcej niż jednym dopasowaniem
- 9. Symfony-2 daje komunikat o błędzie więcej niż jeden walidacji
- 10. Jak połączyć więcej niż 2 zadania za pomocą JobChainingJobListener Quartz.net?
- 11. Największy wspólny dzielnik wielu (więcej niż 2) liczb
- 12. luabind - funkcje z więcej niż 10 argumentami
- 13. ponowne BackgroundWorker więcej niż raz
- 14. list() zużywa więcej pamięci niż rozumienie list
- 15. pętla z więcej niż jednego elementu naraz
- 16. komponent Dagger2 z więcej niż jednej zależności
- 17. vim ukryj z więcej niż jednym znakiem
- 18. SELECT INTO z więcej niż jednym atrybucji
- 19. Śledź więcej niż jedno łącze z vimperatorem
- 20. NSIS Funkcja z więcej niż 1 parametrami
- 21. Android - bindService więcej niż raz
- 22. UITabBarController - więcej niż 20 wyświetleń
- 23. Wzór konstruktora z obiektami zagnieżdżonymi
- 24. Mysqldump więcej niż jeden stół?
- 25. Jak wybrać następne 2 (lub więcej niż 2) elementy za pomocą jQuery .next()?
- 26. dispatch_after versus performSelector afterDelay
- 27. Polimorficzne powiązanie z różnymi obiektami właściciela w Doctrine 2
- 28. Dodaj więcej niż dwa widoki do ViewSwitcher
- 29. TableView ma więcej kolumn niż podano
- 30. MSSQL: Wybierz wiersze z więcej niż 2 zdarzeń w innej tabeli
Podczas korzystania objc_msgSend, trzeba #import wg: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –
ta ostatnia notka, którą napisałeś o upewnieniu się, że wszystkie argumenty są typu id. Czy możesz wyjaśnić dalej? lub dostarczyć trochę zasobów? Nie mogę znaleźć żadnego. –