Сборщик анимаций в + Готово + Обновление TextField
Привет Кто-нибудь может мне помочь с этим, я смотрел на многие предыдущие вопросы по этому вопросу, и они кажутся немного сложными. Я хочу настроить средство выбора, которое анимируется при прикосновении к текстовому полю, у которого есть IBOutlet с именем locationField.
Я не хочу добавлять палитру или панель инструментов и кнопки в свои раскадровки, я предпочел бы делать это программно.
Пока что у меня есть:
- (void)viewDidLoad
{
//populate picker arrays
locationPickerArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
[actionSheet showInView:self.view];
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0,480,32)];
[pickerToolbar sizeToFit];
pickerToolbar.barStyle = UIBarStyleBlackTranslucent;
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonSystemItemCancel target:self action:@selector(cancel_clicked:)];
[barItems addObject:cancelBtn];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[barItems addObject:flexSpace];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done_clicked:)];
[barItems addObject:doneBtn];
[pickerToolbar setItems:barItems animated:YES];
[actionSheet addSubview:pickerToolbar];
UIPickerView *picker = [[UIPickerView alloc] init];
picker.frame = CGRectMake(0, 44, 320, 216);
picker.delegate = self;
picker.dataSource = self;
picker.showsSelectionIndicator = YES;
[actionSheet addSubview:picker];
}
-(void)done_clicked:(id)sender
{
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}
-(void)cancel_clicked:(id)sender
{
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}
У меня есть несколько вопросов по этому поводу, он падает на:
* Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: '-[DetailsScreenViewController numberOfComponentsInPickerView:]: нераспознанный селектор, отправленный экземпляру 0xb505be0'
Что это значит?
Мой последний вопрос: как я могу заполнить этот сборщик и назначить его всплывающему окну при нажатии на созданный ранее иблет (поле местоположения).
Спасибо
1 ответ
Причина вашего сбоя в том, что вы назначили экземпляр DetailsScreenViewController
быть dataSource
а также delegate
из UIPickerView
без фактической реализации методов для этих протоколов. Назначение происходит здесь:
picker.delegate = self;
picker.dataSource = self;
Конкретный сбой говорит вам, что вы не реализовали numberOfComponentsInPickerView:
, часть UIPickerViewDataSource
протокол. Вы должны были получить предупреждение компилятора об этом на самом деле. Научиться использовать эти предупреждения может быть очень полезным! В любом случае, чтобы исправить это, предоставьте реализации всех необходимых методов для обоих протоколов. Детали реализации будут зависеть от потребностей вашего приложения. Если вам все еще нужна помощь с деталями, дайте мне знать.
Что касается вашего второго вопроса, я полагаю, UIPickerView
внутри UIActionSheet
это вещь сейчас. У меня никогда не было необходимости делать это раньше, но вот такой вопрос с большим количеством примеров кода для некоторой предыстории, не уверенный, читали ли вы его еще. Но я думаю, что вы просто хотите подождать, пока вы действительно захотите показать сборщику
[actionSheet showInView:self.view];
Я думаю, что вы можете сделать это в UITextFieldDelegate
Метод, возможно, есть и другие способы. Я собираюсь попытаться сделать некоторые эксперименты с этим позже и обновить этот пост.
РЕДАКТИРОВАТЬ: Если вы назначаете свой контроллер представления в качестве делегата любого интересующего вас текстового поля, то вы можете реализовать это UITextFieldDelegate
метод:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
[actionSheet showInView:self.view];
return NO;
}
КОНЕЦ РЕДАКТИРОВАНИЯ
Надеюсь, это поможет, и дайте мне знать, если у вас есть какие-либо вопросы.