Раскрывающийся и убирающийся выпадающий список в приложении для iPhone - PullRequest
0 голосов
/ 24 марта 2011

Я начинаю разработку приложения для iPhone.Мне нужно представить раскрывающийся список, чтобы клиент мог выбрать значение, которое по существу будет отправлено в базу данных после отправки.Я явно использую UIPickerView для раскрывающегося списка, построенного из IB.

После загрузки моего просмотра включается раскрывающийся список со всеми значениями.

Вопрос:

  1. Могу ли я раскрыть раскрывающийся список только после его щелчка?
  2. Можно ли убрать список, когда пользователь выберет значение?

IЯ думаю о веб-ориентированности с точки зрения выпадающих, но я мог бы все это неправильно.

Ответы [ 2 ]

1 голос
/ 24 марта 2011

Ваш контроллер представления должен реализовать UIPickerViewDataSource , а также UIPickerViewDelegate .В XIB UIPickerView вам нужно связать владельца файла с делегатом и источником данных UIPickerView.

Как и в UITabelDataSource, вам нужно указать количество компонентов (table: section) внутри [numberOfComponentsInPickerView].Затем необходимо указать количество строк для каждого компонента в [numberOfRowsInComponent] .Наконец, вам нужно предоставить заголовок для каждой записи внутри [titleForRow] .

Теперь, чтобы воплотить все в жизнь, вы можете использовать [didSelectRow] для загрузки следующегокомпонента, если был выбран предыдущий.

Внимание: В UIPickerView есть небольшая ошибка, не позволяющая вызывать [didSelectRow] , когда компонент заполнен / изменен.Чтобы сделать его более плавным, я добавил запись «Нет» в качестве первой записи, которая не является выборкой и не приводит к загрузке следующего компонента.

Это элементарный код:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 3; // Number of Components aka Columns
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    if( component == 0 ) {
        return [self.firstColumnEntries count] + 1;
    } else if( component == 1 ) {
        return [self.secondColumnEntries count] + 1;
    } else if( component == 2 ) {
        return [self.thirdColumnEntries count] + 1;
    }
    return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSLog( @"titleForRow(), component: %d, row: %d", component, row );
    NSDictionary *item = nil;
    if( row == 0 ) {
        return @"  ---  ";
    } else {
        int correctedRow = row - 1;
        if( component == 0 ) {
            item = [self.firstColumnEntries objectAtIndex:correctedRow];
        } else if( component == 1 ) {
            item = [self.secondColumnEntries objectAtIndex:correctedRow];
        } else if( component == 2 ) {
            item = [self.thirdColumnEntries objectAtIndex:correctedRow];
        }
        return [item objectForKey:@"name"]; // My objects are NSDictionarys
    }
}

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    DLog( @"SSVC.didSelectRow(), component: %d, row: %d", component, row );
    ActionRequest *action = nil;
    if( row == 0 ) {
        if( component == 0 ) {
            [self refreshFirstColumn:self.firstColumnEntries];
        } else if( component == 1 ) {
            ...
        }
    } else {
        // Last Column is selected. Now selection is complete
        ...
    }
}

Поскольку UIPickerView отнимает много места и вы не можете изменить его размер, я бы порекомендовал поместить его в дополнительный UIView (сделать остальное прозрачным) и отображать его, когда пользователь выбрал назначенное полек значению (UITextField).Когда выбор сделан (либо когда выбрано последнее значение, либо когда пользователь вводит кнопку), вы позволяете представлению исчезнуть и установите значение в UITextField.Убедитесь, что UITextField не может быть отредактирован, и что при его вводе отображается представление с представлением выбора.Когда закончите, убедитесь, что вы также переходите к следующему полю.

0 голосов
/ 24 марта 2011

У вас есть пара опций:

  1. Возможно, проще всего для новичка: выдвинуть новое представление (либо в виде модального вида, либо в стек навигации), которое представляет список либо как табличное представление, гдеони щелкают по элементу, который они хотят, или как средство выбора, где оно прокручивается.
  2. Просмотрите приложение «Мой профиль» в приложении Twitter.Хотя я не делал этого лично, я думаю, что он просто использует didSelectRowAtIndex, чтобы определить, какой раздел щелкнул пользователь, а затем заполнил массив значений для этого раздела перед вызовом [tableView reloadData]
...