отключение значений в одном компоненте средства выбора на основе значения, выбранного в другом компоненте - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь реализовать пользовательский сборщик.Он имеет 3 компонента.Теперь я хочу выделить некоторые значения во втором компоненте в зависимости от выбранного значения первого компонента.Я ссылался на многие сайты и пытался гуглить, чтобы отключить значения. (Точнее, что-то вроде uidatepicker, где, если мы выберем feb, 29 и 30 будут серыми. Но я пытаюсь сделать это в пользовательском средстве выбора, реализуя свойсодержание).Кто-нибудь может мне помочь, как отключить значения в пользовательском средстве выбора?Я попытался использовать функцию

[myPickerView selectRow:27 inComponent:1 animated:NO];

на основе условий if.Он напрямую переходит к значению, но не выделяет ненужные значения серым цветом.

Мой код:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
 NSString *returnStr = @"";

 // note: custom picker doesn't care about titles, it uses custom views
 if (pickerView == myPickerView)
 {
  if (component == 0)
  {
   returnStr = [pickerViewArray objectAtIndex:row];
  }
  else if(component ==1)
  {
   returnStr = [pickerViewArray1 objectAtIndex:row];
  }
  else
  {
   returnStr = [pickerViewArray2 objectAtIndex:row];
  }
 }

 return returnStr;
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
 CGFloat componentWidth = 0.0;

 if (component == 0)
 {
  componentWidth = 140.0;
 }// first column size is wider to hold names
 else if(component ==1)
 {
  componentWidth = 40.0;
 }// second column is narrower to show numbers
 else if(component == 2)
 {
  componentWidth = 100;
 }

 return componentWidth;
}

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
 return 40.0;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
 //return [pickerViewArray count];
 if (component == 0)
 {
  return [pickerViewArray count];
 }// first column size is wider to hold names
 else if(component ==1)
 {
  return [pickerViewArray1 count];
 }

 else
 {
  return [pickerViewArray2 count];
 }


}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
 return 3;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
 if (pickerView == myPickerView) // don't show selection for the custom picker
 {
  // report the selection to the UI label


  label.text = [NSString stringWithFormat:@"%@  %@  %@",
      [pickerViewArray objectAtIndex:[pickerView selectedRowInComponent:0]],
      [pickerViewArray1 objectAtIndex:[pickerView selectedRowInComponent:1]],[pickerViewArray2 objectAtIndex:[pickerView selectedRowInComponent:2]]];
 }
}

Ответы [ 2 ]

1 голос
/ 20 ноября 2010

Я не пробовал, но есть -pickerView:viewForRow:forComponent:reusingView:. В его документации сказано:

Если ранее использовавшееся представление (параметр view) является адекватным, верните его. Если вы возвращаете другое представление, ранее использованное представление освобождается. Представление средства выбора центрирует возвращенное представление в прямоугольнике для строки.

так что, если я правильно пойму, вы можете принять это переданное в поле зрения, изменить его (серым) и вернуть его.

0 голосов
/ 20 ноября 2010

Вы заявили, что ваш контроллер соответствует протоколу в вашем заголовочном файле? Знаете ли вы, если вышеупомянутые методы делегата вызываются при изменении вашего выбора, в частности, didSelectRow один?

Чтобы выяснить это, просто установите точку останова для этого метода, соберите и запустите и попробуйте изменить выбор вида выбора.

Как только у вас возникнет такое подозрение, нужно проанализировать выбор и извлечь правильный источник данных, а затем перезагрузить компонент, который, как вам кажется, отсутствует в приведенной выше реализации:

[pickerView reloadComponent:(int)];

Надеюсь, это поможет. Ура, Рог

...