1. Objective C / Говнокод #19580

    −56

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    + (UIView *) createTextField:(NSString *)placeholder {
    	UIView * view = [UIView new];
        view.frame = CGRectMake(0, 0, 100, 50);
        view.autoresizesSubviews = YES;
        view.backgroundColor = [UIColor whiteColor];
        view.layer.borderWidth = 0.5;
        view.layer.borderColor = COLOR(204, 204, 204).CGColor;
        view.layer.cornerRadius = 5;
        view.exclusiveTouch = YES;
        
        UITextField * testField = [UITextField new];
        testField.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        testField.textColor = [UIColor blackColor];
        testField.borderStyle = UITextBorderStyleNone;
        testField.autocorrectionType = UITextAutocorrectionTypeNo;
        [view addSubview:testField];
    
       return view;
    }
    
    Потом у нас есть какойто контроллер
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        textField = [[MyClass createTextField:@"CITY, STATE OR ZIP"] subviews][0];
        textField.returnKeyType = UIReturnKeySearch;
        textField.delegate = (id<UITextFieldDelegate>)self;
        [self.view addSubview:textField.superview];
    }

    На iOS 8.4 на устройстве текстфилд не будет отображаться
    Нужно делать так:

    UIView * v = [MyClass createTextField:@"CITY, STATE OR ZIP"];
    textField = [v subviews][0];
    [self.view addSubview:textField.superview];

    Запостил: COCOK-MAMOHTA, 05 Марта 2016

    Комментарии (14) RSS

    • > На iOS 8.4 на устройстве текстфилд не будет отображаться
      ARC успевает выпилить view вместе с textfield'ом до того, как ты вытащишь из него textfield?
      Ответить
      • ARC выпиливает textField.superview, поэтому не отображается
        Ответить
        • А вот такой код разве не прокатит?
          UIView * v = [MyClass createTextField:@"CITY, STATE OR ZIP"];
          textField = [v subviews][0];
          // some work with textfield
          [self.view addSubview:v];
          Имхо, наглядней.

          P.S. Хотя, по-хорошему, вообще не стоит копаться в кишках того View... Нарушение инкапсуляции и всё такое.
          Ответить
          • Читай комментарий к говнокоду. Я такой пример и написал. Такой будет работать
            Ответить
            • Ты написал: [self.view addSubview:textField.superview];
              А я спрашивал про более очевидное: [self.view addSubview:v];
              Ответить
              • Ааа ... это уже не важно ... и так и так будет работать ... потому что
                UIView * v = [MyClass ... делает ratain
                Ответить
                • Ну мне вот всё-таки не нравится, что код копается в кишках компонента... Достаёт оттуда какой-то textView (откуда он знает, что там вообще есть textView, а тем более - именно первым чилдом?), потом что-то в нём настраивает...

                  Может быть вместо абстрактного UIView вернуть что-то своё и добавить методы для настройки делегата и returnKeyType?

                  Исходная проблема же именно из-за этого черезжопного доступа к textView и возникла :)
                  Ответить
                  • Ты имеешь ввиду создать ксласс типа MyTextfield ?
                    Ответить
                    • Типа да. И пусть он за свои кишки сам отвечает.
                      Ответить
                      • Можно ... но в этом и суть говнокода ) ... если функционал примитивен как в данном случае, имеет ли смысл создавать на это отдельный класс а тем более с новых файлах?
                        Ответить
                        • Вай нот? Код же проще и понятней станет. Да и второй раз можно заюзать этот класс, если на другой форме понадобится.

                          P.S. Или у вас в обжектив си классы так сложно создаются, что на это уходит больше пары минут?
                          Ответить
                          • они в симуле так сложно не создавались
                            Ответить
                            • По мотивам Симулы создали кресты, а Обжектив создали по мотивам Смоллтолка. Он как раз и славился «сложным» созданием объектов, если я ничего не путаю.
                              Ответить
                              • При создании класса Алану Кею на почту приходит уведомление, и пока он не одобрит - никакой компиляции
                                Ответить

    Добавить комментарий