Как переместить кнопки в UIAlertView, чтобы освободить место для вставленного UITextField?

[EDIT] Хмм. Возможно, этот вопрос должен быть озаглавлен "что такое диалоговое окно ввода-вывода по умолчанию, которое вызывается в CocoaTouch?" Я понимаю, что я могу создать целое представление, которое именно то, что я хочу, и обернуть его в контроллер представления и presentModalView - но я вроде как надеялся, что появился стандартный, обычный пользовательский вход "диалог", с помощью Cocoa -touch. "Введите свое имя", "Введите текст для поиска" и т.д., ОЧЕНЬ распространенные вещи!

В любом случае... вот вопрос, который я изначально спросил:

Этот код:

UIAlertView* find = [[UIAlertView alloc] init];
[find setDelegate:self];
[find setTitle:@"Find"];
[find addButtonWithTitle:@"Cancel"];
[find addButtonWithTitle:@"Find & Bring"];
[find addButtonWithTitle:@"Find & Go"];
[find addButtonWithTitle:@"Go To Next"];
[find addSubview:_findText];
CGRect frm = find.frame;
int height = frm.size.height + _findText.frame.size.height + 100; // note how even 100 has no effect.
[find setFrame:CGRectMake(frm.origin.x, frm.origin.y, frm.size.width, height)];
[find setNeedsLayout];
[find show];
[find release];

Создает это предупреждение:

Найти оповещение http://www.publicplayground.com/IMGs/Misc/FindAlert.png

(Я начал с кода из этот вопрос emi1Faber, и он работает как рекламируемый, однако, как я заявляю в своем комментарий, кнопка отмены накладывает текстовое поле.)

Как перетаскивать все, чтобы текстовое поле соответствовало правильно? [findAlert setNeedsLayout], похоже, ничего не делает, даже после того, как я [findAlert setFrame: tallerFrame]. Подсказки?

Спасибо!

8 ответов

Простейший (и самый правильный способ) для перемещения текстового представления вниз - это добавить сообщение

[find setMessage:@"\n"];

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

Полный пример:

// Create Alert
UIAlertView* av = [UIAlertView new];
av.title = @"Find";
// Add Buttons
[av addButtonWithTitle:@"Cancel"];
[av addButtonWithTitle:@"Find & Bring"];
[av addButtonWithTitle:@"Find & Go"];
[av addButtonWithTitle:@"Go to Next"];
// Make Space for Text View
av.message = @"\n";
// Have Alert View create its view heirarchy, set its frame and begin bounce animation
[av show];
// Adjust the frame
CGRect frame = av.frame;
frame.origin.y -= 100.0f;
av.frame = frame;
// Add Text Field
UITextField* text = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
text.borderStyle = UITextBorderStyleRoundedRect;
[av addSubview:text];
[text becomeFirstResponder];

Примечание. Вы также можете изменить подпункты UIAlertView, но так как Apple уже изменила макет UIAlertView, как только вы должны проверить их описания классов и фреймы на известные значения, прежде чем устанавливать новые. Вы даже можете получить что-то вроде этого:

Предварительный просмотр http://booleanmagic.com/uploads/UIAlertViewHack.png


Даже если вы можете получить эту работу, это не будет очень iPhone-y. UIAlertView действительно не предназначен для ввода пользователем, как это. Если вы посмотрите во всех приложениях Apple, вы увидите, что они используют новое представление, которое отображается с помощью метода presentModalViewController: UIViewController.

Изменить. Этот совет уже не так прав, как это было, когда я его написал. Apple все чаще использует представления предупреждений, поскольку текстовые поля ввода и iOS5 даже содержат встроенную поддержку без необходимости возиться с представлениями (посмотрите alertViewStyle свойство).

Я думаю, может быть, если вам нужно иметь четыре кнопки, то использование пользовательского UIViewController, вероятно, по-прежнему остается правильным. Но если вы просто хотите ввести пароль с кнопками ОК/Отмена, то это будет хорошо.


Zoul предложил лучший метод, чтобы захватить ввод пользователя только:

a) Добавьте в свой класс протокол UITextFieldDelegate.

b) Сделайте что-то вроде

UIAlertView *insertScore = [UIAlertView new];
 [insertScore setDelegate:self];
 [insertScore setTitle:@"New Title!"];
 [insertScore addButtonWithTitle:@"Cancel"];
 [insertScore addButtonWithTitle:@"Ok"];
 insertScore.message = @"\n";
 [insertScore addTextFieldWithValue:@"Input" label:@"player"];
 [[insertScore textField] setDelegate:self];
 [insertScore show]; 
 [insertScore release];

c) Важнейшей задачей было установить делегат текстового поля для себя, а затем получить доступ к данным, которые вы можете просто:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{
 NSLog(@"%@",[[alertView textField] text]);
}

Надеюсь, это поможет кому-то, так как я должен был подумать немного, чтобы понять это.


Скорее всего, вы хотели бы изучить метод addTextFieldWithValue для UIAlertView? Добавьте следующий код где-нибудь вверху вашего класса:

@interface UIAlertView ()
- (void) addTextFieldWithValue: (NSString*) val label: (NSString*) label;
- (UITextField*) textField;
@end

Это не официальное, но IMHO его не заставляет вас отказаться от магазина приложений и его гораздо лучшего решения, чем взломать текстовое поле в диалоговом окне.


Объясняет, как установить количество столбцов, не проверял его.

http://iloveco.de/uikit-alert-types/

Однако существует частный метод, setNumberOfRows: (int) n, что позволит вы должны установить максимальное количество строк в отобразите кнопки в. Чтобы использовать это метод, мы должны добавить дополнения к классу UIAlertView. Мы сделайте это, добавив @interface для UIAlertView в нашем .m файле.

// extend the UIAlertView class to remove the warning caused
// by calling setNumberOfRows.
@interface UIAlertView (extended)
- (void) setNumberOfRows:(int)num;
@end

Это позволит нам вызвать метод без компилятора, выдающего нам предупреждение.

[myAlert setNumberOfRows:2];


Попробуйте ввести некоторые (\n) s после названия в инициализации UIAlertView. Это нажмет кнопки. И я согласен с Стивеном здесь. Есть вероятность, что Apple может отклонить приложение, если оно использует элементы управления так, как им не должно быть. (там есть какое-то положение в Руководстве по интерфейсу человека!)


https://github.com/TomSwift/TSAlertView

Эта библиотека фактически создает элемент управления с нуля, вместо того, чтобы пытаться взломать UIAlertView, который обычно является плохим планом (TM)


Этот более простой метод работает для меня:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
 message:@"<alert message="">" delegate:self cancelButtonTitle:@"OK"
 otherButtonTitles:nil];
[alert addTextFieldWithValue:@"" label:@"Text Field"];
</alert>

Надеюсь, что это поможет. Если вам нужны несколько строк кнопок, это:

[alert setNumberOfRows:3];

Приветствия

licensed under cc by-sa 3.0 with attribution.