2009-08-21 2 views
1

Если у меня есть метод, который передает аргумент типа void * (анимация UIView сделала метод stop, должна быть указателем void) или типа id, и я знаю, что аргумент является элементом UIBarButton, и я необходимо отключить его, [barbuttonitem setEnabled: NO] ;, я должен передать аргумент в UIControl, который до такой степени, что мне нужно иметь возможность использовать setEnabled (без предупреждения), или мне нужно полностью отбросить его к UIBarButtonItem? Зачем?iPhone dev - Как далеко я должен бросать?

Спасибо!

ответ

1

UIBarItem является не происходит от UIControl, поэтому приведение к UIControl действительно не является правильным, что нужно сделать. Это работает, потому что оба класса имеют setEnabled: методов.

Броски - это еще одна форма документации; они не влияют на то, что происходит во время выполнения. Если вы ожидаете UIBarItem, то бросьте его как таковой.

+0

О, я думал, что это UIControl. – mk12

2

Я бы сказал, отбросьте его на UIControl, на всякий случай, когда реализация изменится в какой-то момент. Я всегда использовал бы наиболее подходящий интерфейс (а не реализацию), а UIControl - это, вероятно, путь.

+0

Это немного неправильный совет, iftrue. Если вы ожидаете экземпляр UIBarButtonItem, наиболее подходящим ** интерфейсом ** является UIBarButtonItem, а не UIControl. Если вы беспокоитесь об изменении реализации (что вам не нужно для чего-то подобного), вы, в частности, не можете доверить, что он будет иметь тот же суперкласс. – retainCount

+0

У кого-нибудь еще есть мнение? – mk12

+0

Если вы кодируете UIControl, то вы позволяете вам перейти от UIBarButtonItem к чему-то другому (например, UIButton) и все еще работать с вашим кодом. Я бы не стал беспокоиться/ожидать, что суперкласс изменится; в любом случае все элементы управления являются подтипами UIControl в значительной степени как де-факто стандарт; это никогда не изменится. – AlBlue

0

Кастинг только говорит компилятору, что вы ожидаете переменную определенного типа: Это делает не причиной каких-либо изменений в переменной, переданной в Вы можете бросить его UIBarButtonItem без забот..

0

Если я правильно понимаю Objective-C, вы можете вызвать setEnabled непосредственно на объект; вы просто не получите гарантии, что вызов будет проходить. Но если вы знаете, что возвращенный объект является UIBarItem, вы можете его назвать.

Смежные вопросы