#ios #uitextfield #uipickerview
#iOS #uitextfield #uipickerview
Вопрос:
В моем приложении я запрашиваю Parse.com чтобы получить список групп для заполнения UIPickerView. Я хочу добавить еще одну опцию в UIPickerView в самом верху, которая называется «Создать новую группу», в которой она вызовет UITextField, чтобы создать новую группу и перейти оттуда. Как мне добавить это во все остальные поля? Вот как я ее создал на данный момент.
-(void)addPickerView{
__block NSMutableArray *arr = [[NSMutableArray alloc] init];
PFQuery *rejectedNumber = [PFQuery queryWithClassName:@"Group"];
[rejectedNumber orderByAscending:@"GroupName"];
[rejectedNumber findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!objects) {
// Did not find any UserStats for the current user
NSLog(@"NotFound");
} else {
pickerArray = objects;
[myPickerView reloadAllComponents];
}
}];
//pickerArray = GoGo;
self.theView.signUpView.additionalField.delegate = self;
[self.theView.signUpView.additionalField setPlaceholder:@"Choose Group"];
myPickerView = [[UIPickerView alloc]init];
myPickerView.dataSource = self;
myPickerView.delegate = self;
myPickerView.showsSelectionIndicator = YES;
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]
initWithTitle:@"Done" style:UIBarButtonItemStyleDone
target:self action:@selector(finishIt)];
UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:
CGRectMake(0, self.view.frame.size.height-
self.theView.signUpView.additionalField.frame.size.height-50, 320, 50)];
[toolBar setBarStyle:UIBarStyleBlackOpaque];
NSArray *toolbarItems = [NSArray arrayWithObjects:
doneButton, nil];
[toolBar setItems:toolbarItems];
self.theView.signUpView.additionalField.inputView = myPickerView;
self.theView.signUpView.additionalField.inputAccessoryView = toolBar;
}
#pragma mark - Picker View Data source
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component{
return [pickerArray count];
}
#pragma mark- Picker View Delegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component{
[self.theView.signUpView.additionalField setText:self.theGroup];
}
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
PFObject *object = pickerArray[row];
//Assuming "Category" is a string here for your title
self.theGroup = object[@"GroupName"];
return object[@"GroupName"];
}
Ответ №1:
Этого можно добиться двумя способами:
- Добавьте дополнительный объект в первый индекс вашего массива для отображения «Создать новую группу»
- Вы можете использовать методы настройки источника данных и делегирования
UIPickerView
. Нравится:
-(NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
return [pickerArray count] 1; // 1 for the additional row
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:
(NSInteger)row inComponent:(NSInteger)component
{
if (row == 0)
{
// Create New Group clicked
}
else
{
// Some other option selected
}
}
- (NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
NSString *groupName = "Create New Group";
if (row != 0)
{
PFObject *object = pickerArray[row - 1]; // -1 to handle the array index
self.theGroup = object[@"GroupName"];
groupName = object[@"GroupName"];
}
return groupName;
}
Комментарии:
1. И если это не очевидно для операционной системы, то то же самое
pickerArray[row - 1]
необходимо вelse
блоке вdidSelectRow
методе.2. Два вопроса… зачем это нужно @rmaddy? Все работает без этого? Кроме того, в
if (row == 0)
строке кода я пытаюсь представить AlertController, но получаю сообщение об ошибке о попытке представить контроллер оповещений на tabbarcontroller, представление которого не находится в иерархии.3. @user717452: Потому что ваша первая строка представляет элемент «Создать новую группу», а в вашем массиве нет этого объекта. Итак, 1-я строка вашего средства выбора представляет первый элемент (с 0-м индексом) вашего массива. Что касается ошибки оповещения, вам необходимо предоставить дополнительную информацию.
4. Как я могу заставить его отклонить pickervjew и снова открыть клавиатуру, когда я выбираю Создать новую группу?