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

[ПРАВИТЬ] Хмм. Возможно, этот вопрос должен быть озаглавлен «Какое диалоговое представление по умолчанию для ввода данных пользователем вызывается в CocoaTouch?» Я понимаю, что могу создать целое представление именно то, что мне нужно, и обернуть его в контроллере представления и presentModalView - но я как бы надеялся, что появилось стандартное, обычное пользовательское представление «диалога», которое с какао-прикосновением. «Введите ваше имя», «введите текст для поиска» и т. Д., Это ОЧЕНЬ общие вещи!

Во всяком случае ... вот вопрос, как я его первоначально задавал:

Этот код:

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 ]

25 голосов
/ 05 января 2009

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

[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, как только вы должны проверить их описания классов и кадры по известным значениям, прежде чем устанавливать новые. Вы даже можете получить что-то вроде этого:

Preview
(источник: booleanmagic.com )

6 голосов
/ 03 января 2009

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

.

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

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

3 голосов
/ 26 июля 2009

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

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

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

    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) Важнейшей частью было установить делегат textField на себя, а затем для доступа к данным вы можете просто:

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

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

1 голос
/ 07 марта 2010

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

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];
1 голос
/ 05 января 2009

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

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

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

0 голосов
/ 18 июля 2011

https://github.com/TomSwift/TSAlertView

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

0 голосов
/ 10 февраля 2009

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

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

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

[alert setNumberOfRows:3];

Приветствия

0 голосов
/ 05 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...