Firma Cocoa szeroko wykorzystuje delegatów, aby zapewnić (między innymi) metody wywołań zwrotnych dla operacji asynchronicznych. Jednak osobiście nienawidzę modelu delegata i sposobu, w jaki zanieczyszcza on obecną klasę procedurami obsługi dla bardzo specyficznych operacji potomnych. UIAlertView
to doskonały przykład.Tworzenie anonimowych obiektów delegatów w Objective-C
Dlatego zastanawiam się, czy można po prostu utworzyć anonimowy obiekt delegowany, który spełnia wymagania protokołu delegata (takiego jak UIAlertViewDelegate
) za pośrednictwem bloków i przekazać ten anonimowy obiekt wszędzie tam, gdzie oczekiwane jest odwołanie delegata.
sobie wyobrazić coś tak:
id myDelegate = @{
alertView:alertView didDismissWithButtonIndex:index =^{
...
}
};
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:... message:... delegate:myDelegate cancelButtonTitle:... otherButtonTitles:...;
[alertView show];
Słyszałem Objective-C ma kilka dobrych cech językowych dynamiczny, ale nie wiem jak po prostu dodać metodę/wybierak do obiektu. Czy można to zrobić w stosunkowo prosty sposób?
Pojawiło się pytanie o całkowicie ogólnych delegatów sprzed miesiąca: http://stackoverflow.com/q/15438410/603977, a gdzieś jest starsze pytanie specyficzne dla 'UIAlertViewDegate', ale nie mogę go znaleźć na stronie za chwilę. –
Możesz oczywiście utworzyć zupełnie inny obiekt dla delegata. To nie musi być np. Twój ViewController. (Ale bloki Objective-C sprawiają, że moja głowa eksploduje, więc ich unikam). –
Mam nadzieję, że Apple doda API oparte na blokach do rzeczy takich jak UIAlertView, tak jak zrobiły to dla NSOpenPanel po stronie Mac. –