Pull to refresh

Comments 12

Может быть мой вопрос слишком профанский, но почему бы не использовать для определения списка доступных свойств приведение типа указателя к указателю на объект своего класса?
Если я вас правильно понял, после приведения типов компилятор будет выдавать ровно тот список свойств, к типу которого вы привели. Т.е.
- (void) methodWithId:(id)theId
{
  UIButton *button = (UIButton *)theId;
  [button setText:@"Text" forControlState:UIStateNormal];
}

Скомпилится без ошибок, в реальности же приведет к крашу в случае, если передастся не UIButton, а UILabel (unrecognized selector).

Но, конечно же, можно сделать намного проще — все свойства являются также и селекторами, другими словами никто вам не запрещает написать так:
if([theId respondsToSelector:@selector(setText:forState:)]) {
}
Возникает резонный вопрос: зачем указатель на UILabel приводить к (UIButton*)? :)
Вам приходит id, вы не знаете на момент компиляции что туда придет.
Видимо, у меня просто не было таких ситуаций, так как я уже во время написания кода знаю что и куда мне придет. Хотя бы только потому что об этом можно спросить у Runtime.
ну да, isKindOfClass:. Но все же весьма и весьма нередки ситуации в больших проектах, когда это неочевидно. особенно если пишете что-то универсальное, какой-нибудь хитрый контрол.
В больших проектах, если не проверять класс контрола, какой-нибудь другой программист обязательно передаст вам что-нибудь такое, после чего вы будете отлаживать приложение в течение пары недель.
Каких нахрен пары недель, такие краши лечатся за 10 минут — неприятно, но не самое худшее. Хуже, если программист злоупотребляет блоками, используя их там где можно использовать методы — тогда стек не размотать.
Надеюсь Apple будет добавлять поддержку большего числа методов. Только что решил два кейса через UIAppearance для UINavigationBar и задумался о кастомном UIToolBar, потому что выглядит как костыль:

кейс 1
заменить кнопку Back на маленькую картинку:

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:[[UIImage imageNamed:@"back_nav_button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.f, 21.f, 0.f, 5.f)]
                                                      forState:UIControlStateNormal
                                                    barMetrics:UIBarMetricsDefault];


resizableImageWithCapInsets нужен для того чтобы нам не отресайзило картинку криво (фактически ее ресайзить не надо, но поскольку это bg image, то она растягивается по умолчанию)

кейс 2
убрать текст с кнопки Back (по дизайну не надо)

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment: UIOffsetMake(0.f, -44.f) forBarMetrics:UIBarMetricsDefault];
Создается впечатление, что в связи с выходом iOS7 необходимость в стилизации почти пропадет — ведь в ней эпл утверждает что реалистичный вид приложений (имитирующий объекты реального мира) это прошлый век.
Apple любит сегодня утверждать одно, и хомячки соглашаются — Apple всегда прав. А завтра Apple утверждает совершенно обратное, и хомячки опять соглашаются. этожэпл!
Sign up to leave a comment.

Articles