Добавить статическую строку в UIPickerView

#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:

Этого можно добиться двумя способами:

  1. Добавьте дополнительный объект в первый индекс вашего массива для отображения «Создать новую группу»
  2. Вы можете использовать методы настройки источника данных и делегирования 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 и снова открыть клавиатуру, когда я выбираю Создать новую группу?