есть ли метод делегата uipickerview, как scrollviewDidScroll? - PullRequest
5 голосов
/ 02 октября 2011

У меня настроенный вид UIPickerview, и я не хочу использовать средство выбора даты.Я хочу реализовать функцию, когда пользователь прокручивает часы вверх / вниз, компонент AM / PM переключается, когда час прокручивается.Это означает, что мне нужно переключить его перед вызовом pickerView didSelectRow.Есть ли способ сделать это?

Спасибо

Ответы [ 4 ]

13 голосов
/ 02 октября 2011

Используйте следующий метод,

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
     // put your logic here.
}

Вышеуказанный метод взят из UIPickerViewDelegate. Если пользователь выбирает какой-либо элемент с помощью средства выбора, этот метод запускается автоматически.

Надеюсь, это поможет вам.

Редактировать :

Я думаю, что вы должны использовать следующий метод для определения - в каком направлении пользователь прокручивает?

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSLog(@"scrolling to row is %@",[NSString stringWithFormat:@"index_%i",row]);
    return [NSString stringWithFormat:@"index_%i",row];
}

всякий раз, когда пользователь прокручивает вверх / вниз выше, метод запускается автоматически, что аналогично UITableView. Помните, UIPickerView использует UIPickerTableView, который является частным, поэтому мы не можем обнаружить прокрутку так, как вы хотите.

Позвольте мне объяснить определение направления в окне выбора.

Пример. Видимые строки index_4,index_5,index_6,index_7. Теперь, если пользователь прокручивает вниз, будет вызываться index_8. Точно так же, если пользователь выполняет прокрутку до index_3, будет вызван

.

Надеюсь, этот трюк решит вашу проблему. Даже если дайте мне знать ваши отзывы по этому поводу.

3 голосов
/ 30 июня 2014

необходимо использовать этот метод делегата UIPickerView для события:

ЗАВЕРШЕНО СВИТОК:

- (void)pickerView:(UIPickerView *)pV didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSLog(@"pickerView didSelectRow %zd",row);
    // DID END SCROLL: CALL YOUR HEANDLER METHOD!!
}

НАЧНЕТСЯ СКРОЛИРОВАТЬ:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{
    // WILL START SCROLLING: CALL YOUR HEANDLER METHOD!!
    UILabel* label = (UILabel*)view;
    if (!label){
        label = [UILabel new];
        [label setFrame:frame];
        [label setBackgroundColor:[UIColor clearColor]];
        [label setFont:[UIFont fontWithName:FONT_QUICKSAND_BOLD size:12]];
        [label setTextAlignment:NSTextAlignmentRight];
        [label setLineBreakMode:NSLineBreakByTruncatingMiddle];
        [label setTextColor:UIColorFromRGB(0X2692ff)];
        }
    //Update labeltext here
    [label setText:[NSString stringWithFormat:@"row %zd",row]];
    return label;
}

, конечно, за исключением построения UIPickerview (firstTIME!); так что вам нужно реализовать поддельное событие didendscroll, когда вы закончите сборку своего пикера, или проигнорировать первую прокрутку при запуске для видимой строки пикера

2 голосов
/ 09 мая 2018

К сожалению, вышеприведенные решения (установка флага при вызове методов источника данных, таких как titleForRow и сброс его при вызове didSelectRow) являются схематичными и не будут работать во многих случаях.Методы источника данных могут вызываться во многих случаях, когда пользователь не выполняет прокрутку - например, изменения пользовательского интерфейса, приводящие к изменению макетов представления, а также могут вызываться сразу после didSelectRow - у вас нет контроля над вызовом этих методов.

В связи с этим конкретным вопросом эти решения могут работать, поскольку эти методы всегда вызываются при прокрутке, а не ТОЛЬКО при прокрутке.Однако необходимо соблюдать осторожность, чтобы не предполагать, что пользователь ДОЛЖЕН выполнять прокрутку в этих случаях.Кроме того, если вы управляете конечным автоматом с этим флагом (например, отключение какой-либо кнопки при прокрутке и включение ее после), у вас возникнут проблемы.

Наконец, это позволяет обнаруживать только прокрутку (с указанными выше предостережениями).), но он не будет сообщать вам значения скорости или тока - поэтому будет сложно определить, когда следует переключать метку AM / PM.

Единственный способ, которым я смог надежно обнаружить прокрутку, был черезбеспорядок флагов, которые я установил, когда были сделаны изменения пользовательского интерфейса, и другие уродливые хаки (например, ожидание 100 мс после didSelectRow, прежде чем пытаться снова обнаружить прокрутки, потому что я заметил вызовы источника данных сразу после didSelectRow).Добавление методов willScroll / didScroll к делегату выглядит очевидной вещью, которую Apple пренебрегла добавить.

2 голосов
/ 22 мая 2017

Существует хитрость для обнаружения этого, но нет метода / свойства делегата, чтобы определить, если его прокрутка или нет

  1. принимает свойство как isScrolling
  2. установите isScrolling в true вfunc pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? или эквивалентный метод
  3. установите isScrolling в false в func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

надеюсь, что это поможет, кстати, это то, что объясняется во всех вышеупомянутых ответах

...