Почему метод делегата UIPickerView widthForComponent не вызывается при каждом отображении представления? - PullRequest
1 голос
/ 26 октября 2009

У меня есть два элемента управления на экране iPhone - TableView и UIPickerView. Когда вы выбираете одну ячейку в TableView, вы попадаете на другой экран, где отображается список типов одежды. Выбор одного предмета одежды из списка возвращает вас к первому экрану. В зависимости от вашего выбора количество компонентов в UIPickerView изменяется (1-4), и каждый компонент заполняется соответствующими данными.

Допустим, у вас есть три элемента в списке типов одежды, и каждый элемент должен иметь определенное количество компонентов в UIPickerView, когда он выбран:

Пояс - 3 компонента шириной 100, 55, 100 Бюстгальтер - 3 компонента шириной 55, 55, 55 Другое - 4 компонента шириной 100, 100, 55, 50

Сценарий № 1 - Все как и должно быть

1.1 - Вы выбираете предмет одежды "Пояс", и UIPickerView рисуется с 3 компонентами с соответствующими данными Пояса в каждом компоненте. Ширина компонентов составляет 100, 55, 100.

1.2 - Вы выбираете элемент одежды «Другой», и UIPickerView рисуется с 4 компонентами с соответствующими данными Другое в каждом компоненте. Ширина компонентов составляет 100, 100, 55, 50.

1.3 - Вы выбираете предмет одежды "Бюстгальтер", и UIPickerView рисуется с 3 компонентами с соответствующими данными Brassiere в каждом компоненте. Ширина компонентов составляет 55, 55, 55.

Сценарий № 2 - ширина компонентов не перерисовывается

1.1 - Вы выбираете предмет одежды "Пояс", и UIPickerView рисуется с 3 компонентами с соответствующими данными Пояса в каждом компоненте. Ширина компонентов составляет 100, 55, 100.

1.2 - Вы выбираете предмет одежды "Бюстгальтер", и UIPickerView рисуется с 3 компонентами с соответствующими данными Brassiere в каждом компоненте. Однако ширины компонентов по-прежнему составляют 100, 55, 100, а не 55, 55, 55.

1.3 - Вы выбираете «Другой» предмет одежды, и UIPickerView рисуется с 4 компонентами с соответствующими Другими данными в каждом компоненте. Ширина компонентов составляет 100, 100, 55, 50.

1.2 - Вы выбираете предмет одежды "Бюстгальтер", и UIPickerView рисуется с 3 компонентами с соответствующими данными Brassiere в каждом компоненте. Ширина компонентов теперь правильная - 55, 55, 55.

Начиная с пошагового выполнения кода, похоже, что метод делегата UIPickerView widthForComponent вызывается только при изменении количества компонентов в UIPickerView.

Есть ли способ заставить этот метод делегата запускаться каждый раз?

Обновление - 10.26.09

Я звоню [UIPickerView reloadAllComponents в делегате viewWillAppear, используя следующий код:

-(void)viewWillAppear:(BOOL)animated {

 ...

 self.PopulatePickerArrays; // Populate components based on selection
 [sizePicker reloadAllComponents];

 ...

}

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 01 ноября 2009

Оказывается, что если вы сбрасываете делегат средства выбора, ширина компонента перерисовывается каждый раз, когда делается выбор. Модифицированный код выглядит так:

-(void)viewWillAppear:(BOOL)animated {

 ....

 self.PopulatePickerArray; // Populate components based on selection

 sizePicker.delegate = nil; // NEW CODE
 sizePicker.delegate = self; // NEW CODE

 [picker reloadAllComponents];

}

На этой веб-странице найдена информация - Изменение ширины UIPicker-Continuous

6 голосов
/ 24 августа 2012

На самом деле, просто использование setNeedsLayout также будет работать и может быть немного чище.

[picker reloadAllComponents];
[picker setNeedsLayout];
0 голосов
/ 26 октября 2009

Я не уверен, но вы можете попробовать вызвать [pickerView reloadAllComponents]; в вашем методе viewWillAppear.

  if(currentNumbersOfComponents < 4){
    currentNumbersOfComponents++;
    [picker reloadAllComponents];
}

Метод numberOdComponents возвращает currentNumberOfComponents

...