Comments 28
Зачем добавили в репозиторий кучу мусора, например нужно убрать оттуда совсем папку build.
Судя по вашим предыдущим работам делаете успехи.
уже и CGFloat вместо float исползуете и управление памятью тоже с первого взгляда нормальное, но есть много мелких замечаний и пару серьезных, например:
Там нужно ставить «self =», надеюсь понятно почему и объяснять не нужно.
Далее, зачем городить такие конструкции ???
проще и быстрее сделать так:
Быстрее, и универсальней, так как еще и наследников покрывает, а если нужен точный класс то для этого есть другой метод.
Ну и еще несколько замечаний, который постарайтесь найти сами.
Судя по вашим предыдущим работам делаете успехи.
уже и CGFloat вместо float исползуете и управление памятью тоже с первого взгляда нормальное, но есть много мелких замечаний и пару серьезных, например:
- (id)initWithFrame:(CGRect)frame {
if ((self == [super initWithFrame:frame])) {
[self setup];
}
return self;
}
- (id)init {
if ((self == [super init])) {
[self setup];
}
return self;
}
Там нужно ставить «self =», надеюсь понятно почему и объяснять не нужно.
Далее, зачем городить такие конструкции ???
[NSStringFromClass([v class]) isEqualToString:@"UIButton"]
проще и быстрее сделать так:
[v isKindOfClass:[UIButton class]];
Быстрее, и универсальней, так как еще и наследников покрывает, а если нужен точный класс то для этого есть другой метод.
Ну и еще несколько замечаний, который постарайтесь найти сами.
Метод «getKeyboardWindow» заставил меня заплакать, неужели вы считаете это хорошей реализацией?
Не могли бы вы объяснить а что именно смутило вас?
есть более изящные и элегантные решения работы с NSArray и элементами в нем.
Я надеюсь вы не про [arr objectAtIndex:1]?
нет, конечно не в этом дело.
Там в общем целых нцать замечаний,
Почему не использовать indexOfObjectPassingTest?
если хотите поддержать 2 платформу, то почему бы не использовать предикат?
Ну раз решили «влоб» перебором, то зачем плодить дополнительные ветвления в коде, лучше было бы сделать как-нибудь так:
Ну и наконец — это PrivateAPI.
Там в общем целых нцать замечаний,
Почему не использовать indexOfObjectPassingTest?
если хотите поддержать 2 платформу, то почему бы не использовать предикат?
Ну раз решили «влоб» перебором, то зачем плодить дополнительные ветвления в коде, лучше было бы сделать как-нибудь так:
for (UIWindow *w in [[UIApplication sharedApplication] windows])
if ([NSStringFromClass([w class]) isEqualToString:@"UITextEffectsWindow"]) return w;
return nil;
Ну и наконец — это PrivateAPI.
вернее класс UITextEffectsWindow — не из публичного API, что делает код не стабильным — может поломаться с выходом новой версии (хотя в данном случае разве что с выходом IOS5)
Скажу честно, это единственный способ который я нашел чтобы получить доступ к нужной view.
По поводу поломаться с новой версией согласен.
На 5.0 протестировал, работает, думаю со временем найду более лучшее решение
По поводу поломаться с новой версией согласен.
На 5.0 протестировал, работает, думаю со временем найду более лучшее решение
Документацию по языку хороши читали, что вот это такое?:
Булевые значения: YES/NO.
[v setHidden:FALSE];
Булевые значения: YES/NO.
Для тех, кто считает, что я придираюсь на ровном месте.
В первую очередь — это нарушение стиля кода для платформы.
А вообще BOOL в Objective-C содержит в себе подводные камни, на которые некоторые новички спотыкаются, и придерживаться документации в данном случае крайне полезно.
Не многие знают что bool и BOOL — это разные типы — первый это из C99 стандарта, а второе — это занковый char, который был введен в Objective-C для булевого значения, когда в С его не было.
тоесть:
А сами значения определены:
Некоторые спросят, «ну и что» ?, а вот что, вот например такой код:
Поулчается что аа при не отрицательное значение, но при явном сравнении с YES тоже дает отрицательный результат.
И стоит помнить, что bool!=BOOL и bool может иметь только значения true или false.
В первую очередь — это нарушение стиля кода для платформы.
А вообще BOOL в Objective-C содержит в себе подводные камни, на которые некоторые новички спотыкаются, и придерживаться документации в данном случае крайне полезно.
Не многие знают что bool и BOOL — это разные типы — первый это из C99 стандарта, а второе — это занковый char, который был введен в Objective-C для булевого значения, когда в С его не было.
тоесть:
typedef signed char BOOL;
А сами значения определены:
#define YES (BOOL)1
#define NO (BOOL)0
Некоторые спросят, «ну и что» ?, а вот что, вот например такой код:
BOOL aa = 2;
if (aa) printf("aa 1\n");
if (aa != YES) printf("aa 2\n");
результат:
>aa 1
>aa 2
Поулчается что аа при не отрицательное значение, но при явном сравнении с YES тоже дает отрицательный результат.
И стоит помнить, что bool!=BOOL и bool может иметь только значения true или false.
Cпасибо за полезное замечание
>> [NSStringFromClass([v class]) isEqualToString:@«UIButton»]
Это на самом деле можно было написать проще
>> [NSStringFromClass([v class]) isEqualToString:@«UIButton»]
Это на самом деле можно было написать проще
зачем тут приведение класса?
В 131 строке зачем делать:
если мы несколькими строчками выше проверили, что эта переменная нулевая?
buttonDone = [(UIButton *)v retain];
В 131 строке зачем делать:
[buttonDone release];
если мы несколькими строчками выше проверили, что эта переменная нулевая?
Да, ошибка. Надо было так
buttonDone = button;
[button release];
По поводу приведения класса, ведь мы сначала объявляем объект как UIView
for (UIView *v in [windowTemp subviews]) {
Потому перед прививанием явно указываю что это UIButton
buttonDone = button;
[button release];
По поводу приведения класса, ведь мы сначала объявляем объект как UIView
for (UIView *v in [windowTemp subviews]) {
Потому перед прививанием явно указываю что это UIButton
if ([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3"]) {
[buttonDone setBackgroundImage:[UIImage imageNamed:@"AMTextFieldNumberPad.bundle/button_keyboard3.png"] forState:UIControlStateNormal];
[buttonDone setBackgroundImage:[UIImage imageNamed:@"AMTextFieldNumberPad.bundle/button_keyboard3_highlighted.png"] forState:UIControlStateHighlighted];
}
else {
[buttonDone setBackgroundImage:[UIImage imageNamed:@"AMTextFieldNumberPad.bundle/button_keyboard4.png"] forState:UIControlStateNormal];
[buttonDone setBackgroundImage:[UIImage imageNamed:@"AMTextFieldNumberPad.bundle/button_keyboard4_highlighted.png"] forState:UIControlStateHighlighted];
Не очень хорошее решение, лучше было бы эти текстовые константы вынести в отдельное место и «спрятать» специфичное для каждой версии поведение от рабочей реализации.
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
А как вы сделали файл bundle с изображениями? И как с ним работаете в коде.
И суровые дяди из аппстора не против, что вот так меняют их классные продуманные нативные контролы? Это проходит аппрув?
Классные не то слово, если бы они в правду сделали классные, то мне бы не пришлось решать задачу как убрать клавиатуру по кнопке, и самое главное в iPad это решено, а iPhone забыли.
Апрув это проходит
Апрув это проходит
Sign up to leave a comment.
Добавляем кнопку для UIKeyboardTypeNumberPad