Мне нужно ввести имя, отчество и фамилию, когда пользователь добавит контакт в свою адресную книгу.
PS: Наконец-то я нашел контроль, который позволяет: https://github.com/eaigner/CODialog
Мне нужно ввести имя, отчество и фамилию, когда пользователь добавит контакт в свою адресную книгу.
PS: Наконец-то я нашел контроль, который позволяет: https://github.com/eaigner/CODialog
Можете ли вы предложить что-то, что я могу использовать вместо этого?
Я бы представил модальное представление через 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 варианта:
Но если кто-то все еще убежден, что возиться с иерархией представлений ЯВЛЯЕТСЯ хорошей идеей и знает лучше меня и инженеров 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));
Результат:
Вы хотите, вы можете сделать это таким образом.
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.
init…
и, вероятно, добавляются в качестве меток в layoutSubview
или каким-либо другим скрытым методом. Вы анализировали подпредставления предупреждений? 05.01.2013 addSubView:
будет невозможно: stackoverflow.com/questions/18729220/ 14.09.2013 Используйте свойство 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];
layoutSubviews
05.01.2013show
. см. мой пример Не пытайтесь повторить это дома. 05.01.2013