/ / Zaakceptuj zarówno UIButtons, jak i UIViews jako parametry metody - target-c, ios, xcode

Zaakceptuj oba UIButtons i UIViews jako parametry dla metody - target-c, ios, xcode

Jak napisać funkcję, która jako parametr przyjmie UIView lub UIButton.

Na przykład, powiedzmy, że chciałem zaokrąglić rogi w widoku / przycisku:

[self roundCorners:x]

Jak sprawić, by akceptował zarówno obiekt UIButton, jak i obiekt UIView jako x?

Moje pierwsze myśli to użycie id lub NSObject, ale nie sądzę, żeby to było poprawne:

-(void)roundCorners:(id)objectToRound;

Przepraszam za pytanie początkującego; Nadal rozumiem. Dziękuję Ci!

Odpowiedzi:

8 dla odpowiedzi № 1

UIButton jest podklasą UIView, więc twoja metoda przyjmie jedną z nich, jeśli zadeklarujesz to w ten sposób:

- (void)roundCorners:(UIView *)objectToRound;

1 dla odpowiedzi nr 2

Krótka odpowiedź:

if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *) view;
// do something funky with button


} else {
// do something funky with view

}

Szczegółowa odpowiedź:

Po pierwsze tak jest zwykle Najlepiej mieć określoną metodę obsługi każdej klasyobiekt. Dzieje się tak, aby kompilator mógł rozwiązać potencjalnie przekazanie niewłaściwej klasy do metody. Są jednak chwile, kiedy nie jest to właściwe ani możliwe.

UIView i UIButton są ostatecznie potomkami NSObject.

NSObject ma metodę isKindOfClass: których możesz użyć do ustalenia, z czym masz do czynienia. Posunąłem się o krok dalej, definiując kilka makr pomocniczych, które upraszczają tego rodzaju zadania, które czasem są dość pracochłonne.

Jeśli spojrzysz na moją odpowiedź na to pytanie... zobaczysz kod źródłowy i przykład użycia tych makr. Często używam jednego z tych makr (asClass), który łączy isKindOfClass: test powiązany z typem obsady w testowanej klasie.

Możesz napisać coś takiego, ale uważam, że tworzy on bardziej czytelny kod do użycia asClass makro. Mówiąc prościej asClass(myView,UIButton) rozwiąże zero lub odwołanie do rzutowania typu myView jako UIButton - jeśli nie jest to UIButton, zostanie rozwiązane do zera.

Zmodyfikowałem fragment tego wpisu, aby pasował do Twojego pytania:

- (void)myMethod:(UIView*)view{

UIButton *button = asClass(view, UIButton);

if (button) {
// do something funky with button

} else {
// do something funky with view

}

}

Aby zakodować tę długą rękę, (bez makr) będzie wyglądać w przybliżeniu lubię to:

- (void)myMethod:(UIView*)view{


if ([view isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *) view;
// do something funky with button


} else {
// do something funky with view

}

}

Jak widać, nie jest to zbyt wiele dodatkowego koduzrób to długo, a jeśli nie masz ochoty używać makr do takich rzeczy (niektórzy ludzie nie są), możesz pozostać przy drugim przykładzie.

jeśli nie masz nic przeciwko makrom i widzisz zalety przyjętego przeze mnie podejścia, rozważ ten trzeci sposób:

- (void)myMethod:(UIView*)view{

UIButton *button;

if ( (button = asClass(view, UIButton)) ) {
// do something funky with button

} else {
// do something funky with view

}

}

Mam nadzieję, że to pomoże.

Jeśli podoba Ci się ta odpowiedź, zagłosuj na nią. Jeśli lubisz odpowiedź na moje pierwotne pytanie gdzie mieszka kod, również go zagłosuj :-)


0 dla odpowiedzi № 3

Sposób, w jaki to robisz, powinien działać dobrze, id zaakceptuje prawie wszystko.