Nano Hash - криптовалюты, майнинг, программирование

Можно ли сделать UIAlertView с 3 текстовыми полями?

Мне нужно ввести имя, отчество и фамилию, когда пользователь добавит контакт в свою адресную книгу.

PS: Наконец-то я нашел контроль, который позволяет: https://github.com/eaigner/CODialog


  • почему это должен быть AlertView? пользовательский вид, представленный как popOver, может быть лучшим выбором. 05.01.2013
  • Всплывающее окно @vikingosegundo доступно только на iPad. 05.01.2013
  • Извините, я имел в виду модальный вид. 05.01.2013
  • Кстати, на github также есть всплывающие окна для iPhone. Я хочу UIAlertView, потому что это меньше кода (мне не нужно создавать еще один контроллер) и меньше места на экране. 05.01.2013
  • если вы хотите меньше кода, вам следует искать замены uialertview, которые используют блоки вместо делегирования. 05.01.2013

Ответы:


1

Можете ли вы предложить что-то, что я могу использовать вместо этого?

Я бы представил модальное представление через presentViewController:animated:completion: (ios 5+) или presentModalViewController:animated: ios ‹5 (устарело)

Если вы хотите придерживаться предупреждений, вы можете найти замену на cococontrols.com.


Из документации:

Примечания о подклассах
Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представлений для этого класса является закрытой и не может быть изменена.

добавление текстовых представлений изменяет иерархию представлений и может привести к отказу в отправке в магазин приложений.


используя эту категорию вы можете легко проверить иерархию представлений любого представления. (или используйте po [alertView recursiveDescription] в консоли отладчика)

Примечание: этот код НИКОГДА не следует использовать в реальных приложениях.

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title"
                                                        message:@"msg"
                                                       delegate:nil
                                              cancelButtonTitle:@"ok"
                                              otherButtonTitles: nil];

    UITextField *textFiled = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
    [textFiled setText:@"dont try that at home"];
    [alertView addSubview:textFiled];
    [alertView show];
    [alertView printSubviewsWithIndentation:4];

мы будем регистрировать эту иерархию

[0]: class: 'UIImageView'
[1]: class: 'UILabel'
[2]: class: 'UILabel'
[3]: class: 'UIAlertButton'
   [0]: class: 'UIImageView'
   [1]: class: 'UIButtonLabel'
[4]: class: 'UITextField'

в результате этого

скриншот беспорядка в окне предупреждений

TextView просто помещается поверх всех остальных. на самом деле он должен быть помещен под [2]: class: 'UILabel'. Мы могли бы сделать это, повозившись с иерархией представлений (перебрать ее и переупорядочить) или путем подклассификации UIAlertView и перезаписи layoutSubviews. И то, и другое яблоко не хочет.

Подводя итог, если дело доходит до UIAlertView, у вас есть 3 варианта:

  1. живите с этим, как есть (помните, что некоторые формы ввода доступны через предопределенные стили)
  2. используйте какой-либо другой контроллер представления для представления модального представления
  3. использовать замену. но тот, который не является подклассом UIAlertView.


Но если кто-то все еще убежден, что возиться с иерархией представлений ЯВЛЯЕТСЯ хорошей идеей и знает лучше меня и инженеров Apple, вот код

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title"
                                                    message:@"Please read carefully the next 3 lines"
                                                   delegate:nil
                                          cancelButtonTitle:@"ok"
                                          otherButtonTitles: nil];

[alertView show];


CGFloat height = 25.0;

UILabel *msgLabel = [[alertView subviews] objectAtIndex:2];

UITextField *textField1 = [[UITextField alloc] initWithFrame:CGRectMake(msgLabel.frame.origin.x, msgLabel.frame.origin.y+msgLabel.frame.size.height, msgLabel.frame.size.width, height)];
[textField1 setText:@"dont try that at home"];
[textField1 setBackgroundColor:[UIColor whiteColor]];
UITextField *textField2 = [[UITextField alloc] initWithFrame:CGRectOffset(textField1.frame, 0, height + 4)];
[textField2 setText:@"REALLY! dont try that at home"];
[textField2 setBackgroundColor:[UIColor whiteColor]];

UITextField *textField3 = [[UITextField alloc] initWithFrame:CGRectOffset(textField2.frame, 0, height + 4)];
[textField3 setText:@"REALLY! dont try that at home"];
[textField3 setBackgroundColor:[UIColor whiteColor]];

NSArray *followringSubviews = [[alertView subviews] subarrayWithRange:NSMakeRange(3, [[alertView subviews] count] - 3)];
[followringSubviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
    view.frame = CGRectOffset(view.frame, 0, 3*height);

}];
[alertView addSubview:textField1];
[alertView addSubview:textField2];
[alertView addSubview:textField3];

alertView.frame = CGRectUnion(alertView.frame, CGRectOffset(alertView.frame, 0, 80));

Результат:

введите здесь описание изображения

04.01.2013
  • Я сделаю это. Но в настоящее время я не могу понять, почему кадр UIAlertView не меняется, даже если я делаю [[UIAlertView alloc]initWithFrame:CGRectMake(12, 90, 260, 50)]; 05.01.2013
  • как я уже говорил: Apple не хочет, чтобы вы меняли внешний вид. Возможно, вы можете обойти это, создав подкласс UIAlertView и перезаписав layoutSubviews 05.01.2013
  • Вы должны установить новый кадр после вызова show. см. мой пример Не пытайтесь повторить это дома. 05.01.2013
  • @vikingosegundo подвиды макета, похоже, не вызываются в iOS7 для UIAlertView :( 01.04.2014
  • @yonel, вы читали ответ: Примечание: это код, который НИКОГДА не следует использовать в реальном приложении. и да: в iOS 7 это, наконец, невозможно, так как это всегда запрещалось документацией. . 01.04.2014

  • 2

    Вы хотите, вы можете сделать это таким образом.

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title" message:@"msg" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
    UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 45.0, 260.0, 25.0)];
    txtField.text=@"anoop here";
    [alertView addSubview:txtField];
    [alertView show];
    

    РЕДАКТИРОВАТЬ:

    Даже пользовательский вид сделает вашу работу. (как вы можете видеть в моих предыдущих правках.)

    Создайте собственное представление с пользовательским размером формы, цветом, размером текста и т. д., а затем покажите его как окно модели.

    РЕДАКТИРОВАТЬ 2:

    Приведенный выше код не будет работать для iOS7.

    04.01.2013
  • Ну, я вижу пустой UIAlertView в этом случае 04.01.2013
  • Вы добавили что-нибудь в txtField? 04.01.2013
  • Результат тот же для пустых/полных текстовых полей 04.01.2013
  • Apple не хочет, чтобы пользователь менял внешний вид UIAlertView, за исключением заданных стилей, представленных в iOS5. 05.01.2013
  • @vikingosegundo: Да, вот почему я дал этот ответ, а затем отредактировал ответ, добавив еще одно текстовое поле. Так что я все еще в замешательстве, какой ответ я должен опубликовать ?? 05.01.2013
  • Можете ли вы предложить что-то, что я могу использовать вместо этого? 05.01.2013
  • @vikingosegundo Я не согласен. В iOS4 текстового поля вообще не было в окне оповещения. Apple не может рассчитать все случаи. 05.01.2013
  • См. мое редактирование: создайте собственное представление с нестандартным размером формы, цветом, размером текста и т. д., а затем покажите его как окно модели. 05.01.2013
  • @Flink — с чем ты не согласен? 05.01.2013
  • @Flink: я проверил, добавив текст в пользовательский txt, и он работает ... мне пришлось использовать teamviewer :) 05.01.2013
  • Я не думаю, что Apple не хочет, чтобы я изменил внешность. Кроме того, я помню, что видел UIAlerView с tableView внутри него в управлении какао. попробую посмотреть как получилось 05.01.2013
  • Да... это ios6.0, я использую XCode4.5 05.01.2013
  • @Flink — конечно, вы МОЖЕТЕ изменить это, повозившись с подвидами. но эти решения представляют собой хаки, которые могут сломаться в любой момент, когда Apple изменит скрытую деталь реализации. 05.01.2013
  • @Anoop Vaidya Так странно. Не могли бы вы вставить код в свой ответ? 05.01.2013
  • и это яблоко не хочет, чтобы вы его отменяли, это хорошо задокументировано. (какое-то видео wwdc, где была представлена ​​iOS 5) 05.01.2013
  • @Flik — вы должны внимательно посмотреть на github.com/MatthewLabs/MLTableAlert, это замена . даже не подкласс. 05.01.2013
  • keepandshare.com/doc/5409446/screenshot1-png-492k? da=y снимок экрана или xcode и симулятор. 05.01.2013
  • из developer.apple.com/library/ ios/#documentation/UIKit/Reference/ Примечания о подклассах Класс UIAlertView предназначен для использования как есть и не поддерживает создание подклассов. Иерархия представлений для этого класса является частной и не может быть изменена. 05.01.2013
  • @Flink — используйте замену. Ответ Аннопа изменяет иерархию представлений и может привести к отказу Appstore. 05.01.2013
  • @AnoopVaidya — на скриншоте нет ни текстового поля, ни текста anoop. 05.01.2013
  • @vikingosegundo Вот правильный скриншот d.pr/i/wG1C. Он показывает текстовое поле. Но он только один, так что смысла нет. 05.01.2013
  • @vikingosegundo На самом деле это тф. Но если добавить второй tf, то можно увидеть d.pr/i/zgS1 05.01.2013
  • почему ты думаешь, что это текстовое поле? строки передаются в виде init… и, вероятно, добавляются в качестве меток в layoutSubview или каким-либо другим скрытым методом. Вы анализировали подпредставления предупреждений? 05.01.2013
  • @vikingosegundo Я могу написать в нем. Это текстовое поле. Однако я нашел контроль, всем спасибо. 05.01.2013
  • @Flink — мы оба правы. Я покажу вам через секунду в моем ответе. 05.01.2013
  • К вашему сведению: использование addSubView: будет невозможно: stackoverflow.com/questions/18729220/ 14.09.2013
  • @vikingosegundo: Спасибо за информацию. :) Поскольку я не занимаюсь разработкой iOS, мой профиль только OSX, поэтому я не знал об изменениях в ios7. 15.09.2013

  • 3

    Используйте свойство accessorView для просмотра предупреждений

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"change Password " message:@"" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil];
         CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, 300);
         UIView *view = [[UIView alloc] initWithFrame:frame];
    
        UITextField* text1 = [[UITextField alloc] initWithFrame: CGRectMake(10, 10,self.view.frame.size.width-125, 30)];
        text1.backgroundColor=[UIColor whiteColor];
        UITextField* text2 = [[UITextField alloc] initWithFrame: CGRectMake(10, 45, self.view.frame.size.width-125, 30)];
        text2.backgroundColor=[UIColor whiteColor];
        UITextField* text3 = [[UITextField alloc] initWithFrame: CGRectMake(10, 80, self.view.frame.size.width-125, 30)];
        text3.backgroundColor=[UIColor whiteColor];
        text1.layer.borderColor=[UIColor lightGrayColor].CGColor;
        text1.layer.borderWidth=1;
        text2.layer.borderColor=[UIColor lightGrayColor].CGColor;
        text2.layer.borderWidth=1;
        text3.layer.borderColor=[UIColor lightGrayColor].CGColor;
        text3.layer.borderWidth=1;
        text1.placeholder=@"  Enter  old password ";
       [view addSubview:text1];
       [view addSubview:text2];
       [view addSubview:text3];
        [alertView setValue:view forKey:@"accessoryView"];
        view.backgroundColor = [UIColor whiteColor];
        [alertView show];
    
    19.11.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..