Как получить вид выбора с кнопкой "Готово" при нажатии в текстовом поле?
Я пытаюсь создать текстовое поле, которое открывает окно выбора с помощью кнопки "Готово" вместо клавиатуры. Пользователь выбирает категорию в окне выбора, и она будет заполнять текстовое поле при нажатии кнопки "Готово". Я прочитал много сообщений на эту тему и следовал этим инструкциям. но я всегда сталкиваюсь с одной и той же проблемой (см. удар).
Я создал pickerView и инициализировал его своим массивом. Я знаю, что я должен установить inputView моей textFieldCategory для моего pickerView. Когда я запускаю код, все работает нормально, пока я не нажму на текстовое поле Категория. Затем приложение падает, и я получаю следующее сообщение об ошибке:
015-03-23 19:09:18.663 TestApp[903:63946] *** Завершение работы приложения из-за необработанного исключения "UIViewControllerHierarchyInconsistency", причина: "дочерний контроллер представления: должен иметь родительский контроллер представления: но запрошенный родительский объект: UIInputWindowController: 0x7f83f184d400
Кроме того, я поместил вызов метода (self.textFieldCategory.inputView = self.picker;) в нужное место? Я думаю, что сделал, но я продолжаю получать ошибку. Я прочитал несколько постов об этой конкретной ошибке и следовал инструкциям по ее устранению. но описанные случаи были немного другими и с более старыми версиями xcode.
Я даже не ищу, чтобы кто-нибудь показывал мне правильный код, но если бы кто-то мог направить меня в правильном направлении, это было бы очень ценно.
Вот что у меня есть в моем файле ViewController.m:
#import "AddNewObjectViewController.h"
@interface AddNewObjectViewController ()
{
NSArray *_pickerData;
}
//IBAction from textFieldName
- (IBAction)editingChanged:(UITextField *)sender;
@property (weak, nonatomic) IBOutlet UITextField *textFieldName;
@property (weak, nonatomic) IBOutlet UITextField *textFieldCategory;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *saveButton;
@end
@implementation AddNewObjectViewController
- (IBAction)editingChanged:(UITextField *)textFieldName
{
//Activate saveButton if at least one character is entered in textFieldName
_saveButton.enabled = textFieldName.text.length > 0;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//disable saveButton
[_saveButton setEnabled:NO];
//Initialize Data
_pickerData = @[@"Category 1", @"Category 2", @"Category 3", @"Category 4"];
//Connect Data
self.picker.dataSource = self;
self.picker.delegate = self;
self.textFieldCategory.inputView = self.picker;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// The number of columns of data
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
// The number of rows of data
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return _pickerData.count;
}
// The data to return for the row and component (column) that's being passed in
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return _pickerData[row];
}
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if (sender != self.saveButton) return;
if (self.textFieldObjectName.text.length > 0) {
self.myObject = [[MyObject alloc] init];
self.myObject.myObjectName = self.textFieldName.text;
self.myObject.myObjectCategory = self.textFieldCategory.text;
}
}
@end
1 ответ
Хорошо, я только что понял, почему он разбился. Я создал текстовое поле и окно выбора в раскадровке. Чтобы заставить его работать, мне пришлось удалить pickerView из superview:
[self.picker removeFromSuperview];
Я добавил этот метод в viewDidLoad, и теперь, когда я щелкаю текстовое поле, приложение больше не падает, но вызывает pickerView!