Как отформатировать более двух кнопок внутри UIAlertView со стилем UIAlertStylePlainTextInput? - PullRequest
9 голосов
/ 18 марта 2012

Я добавил UIAlertView в свое приложение, которое захватывает ввод пользователя, но я не уверен, как добавить третью кнопку. В идеале три кнопки должны располагаться поперек оповещения по горизонтали или две над кнопкой «Отмена». Ниже приведен фрагмент кода, который я использую для добавления UIAlertView.

- (IBAction)initiateSave{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Archive" 
                                          message:@"Enter a name to save this as:" 
                                          delegate:self 
                                          cancelButtonTitle:@"Cancel" 
                                          otherButtonTitles:@"Save Session",@"Save",nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    UITextField * alertTextField = [alert textFieldAtIndex:0];
    alertTextField.keyboardType = UIKeyboardTypeDefault;
    alertTextField.placeholder = @"eg. My awesome file...";
    alert.tag = 1;
    [alert show];
    [alert release];
    self.name = [[alert textFieldAtIndex:0]text];
}

enter image description here

Ответы [ 6 ]

2 голосов
/ 22 августа 2012

Это прекрасно работает для меня. После показа много нити, наконец, я нашел решение

UIAlertView* getWebUrl = [[UIAlertView alloc] initWithTitle:@"Enter URL" 
                                              message:nil 
                                              delegate:self 
                                              cancelButtonTitle:@"Cancel" 
                                              otherButtonTitles:@"Save", 
                                                                @"Save Url", nil];
getWebUrl.transform=CGAffineTransformMakeScale(1.0, 0.75);
getWebUrl.alertViewStyle=UIAlertViewStylePlainTextInput;
[getWebUrl show];

и выравнивание кнопок и текстового поля после текущего предупреждения

-(void)willPresentAlertView:(UIAlertView *)alertView {
    for (UIView *view in alertView.subviews) {
        if ([view isKindOfClass:[UITextField class]]||
            [view isKindOfClass:[UIButton class]] || view.frame.size.height==31) {
            CGRect rect=view.frame;
            rect.origin.y += 65;
            view.frame = rect;
        }
    }
}
2 голосов
/ 19 марта 2012

Apple действительно не хочет, чтобы вы портились с UIAlertView. Если способ его естественного форматирования сам по себе не отвечает вашим потребностям, вместо этого рассмотрите возможность представления пользовательского («модального») представления.

2 голосов
/ 19 марта 2012

Этого, безусловно, можно достичь, в первую очередь вам нужно настроить что-то вроде этого.

// 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];

Цитата из ... https://stackoverflow.com/a/412618/716216

Тогдахотите анимировать перемещение UIAlertView вверх при вызове клавиатуры ... что-то вроде этого ...

-(void)keyboardWillShow: (id) notification {

if(showAlert==YES)
{

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [createNewAlert setTransform:CGAffineTransformMakeTranslation(0,-60)];
    [createNewAlert show];
    [UIView commitAnimations];
}
}

-(void)keyboardWillHide: (id) notification {

if(showAlert==YES) 
{


        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];
        [createNewAlert setTransform:CGAffineTransformMakeTranslation(0,+60)];

        [UIView commitAnimations];

}
}

Цитата из ... https://stackoverflow.com/a/3844956/716216

Конечно, выВы можете найти дополнительную информацию о пользовательских UIAlertViews в следующем примере кода Apple!https://developer.apple.com/library/ios/#samplecode/UICatalog/Introduction/Intro.html

Удачи !!!!

1 голос
/ 19 марта 2012

Это несколько сложно, Вот решение для этого. Вам нужно использовать \ n в строке сообщения, чтобы увеличить высоту UIAlertView.

- (IBAction)initiateSave{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Archive" 
                                          message:@"\n\n\n\n\n"  // Trick to increase the height
                                          delegate:self 
                                          cancelButtonTitle:@"Cancel" 
                                          otherButtonTitles:@"Save Session",@"Save",nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;

After increasing the height of Alert, now you can add a label to set the message in the label : "Enter a name to save this as:" at appropriate  position.

[alert addSubView: messageLbl];
    UITextField * alertTextField = [alert textFieldAtIndex:0];
    alertTextField.keyboardType = UIKeyboardTypeDefault;
    alertTextField.placeholder = @"eg. My awesome file...";
    alert.tag = 1;
    [alert show];
    [alert release];
    self.name = [[alert textFieldAtIndex:0]text];
}
1 голос
/ 18 марта 2012

Я не думаю, что вы можете вручную изменить размер UIAlertView, но уловка, которую я использую для включения UIActivityIndicatorView, состоит в том, чтобы использовать «/ n» в строке сообщения, чтобы увеличить «сообщение» (по одной дополнительной строке на каждое »/n "), поэтому достаточно места для всего остального.

0 голосов
/ 26 октября 2012

Здесь, немного поздно, но нужно сделать свое дело. (Работа для меня). Создать UIAlertView

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"TITLE"
                                             message:@"BODY"
                                            delegate:self
                                   cancelButtonTitle:@"CANCEL"
                                   otherButtonTitles:@"OK",@"SEARCH",nil];

    alert.tag = kAlertTag;
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    UITextField *alertTextField = [alert textFieldAtIndex:0];
    alertTextField.keyboardType = UIKeyboardTypeDefault;
    alertTextField.placeholder = @"ENTER STH";
    [alert show];
    [alert release];

И реализовать метод делегата.

-(void)willPresentAlertView:(UIAlertView *)alertView {
    if (alertView.tag == kAlertTag) {
        [alertView setFrame:CGRectMake(17, 30, 286, 188)];
        NSArray *subviewArray = [alertView subviews];
        UILabel *messageLB = (UILabel *)[subviewArray objectAtIndex:2];
        [messageLB setFrame:CGRectMake(10, 46, 260, 20)];
        UIButton *cancelBT = (UIButton *)[subviewArray objectAtIndex:3];
        [cancelBT setFrame:CGRectMake(10, 130, 100, 42)];
        UIButton *okBT = (UIButton *)[subviewArray objectAtIndex:4];
        [okBT setFrame:CGRectMake(194, 130, 80, 42)];
        UIButton *searchBT = (UIButton *)[subviewArray objectAtIndex:5];
        [searchBT setFrame:CGRectMake(112, 130, 80, 42)];
        UITextField *plateTF = (UITextField *)[subviewArray objectAtIndex:6];
        [plateTF setFrame:CGRectMake(10, 80, 266, 50)];
        UITextField *placeTF = (UITextField *)[subviewArray objectAtIndex:7];
        [placeTF setFrame:CGRectMake(15, 70, 256, 50)];
    }
}

FYI [subviewArray objectAtIndex: 1] предназначен для заголовка вида предупреждения.

...