Как использовать viewForRow и titleForRow в одном классе для разных сборщиков? - PullRequest
4 голосов
/ 19 ноября 2010

У меня есть 3 средства выбора, один из которых содержит только изображения.

Итак, для этого я должен использовать viewForRow, но для других 2, которые являются обычными средствами выбора с метками, янужно titleForRow, за исключением того, что если я использую viewForRow, titleForRow никогда не вызывается.

Как я могу вызвать обоих делегатов в моем классе?

Это то, что у меня есть:

- (UIView *)pickerView:(UIPickerView *)thePickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{

    [[[objectPicker subviews] objectAtIndex:0] setHidden:YES];
    [[[objectPicker subviews] objectAtIndex:5] setHidden:YES]; 
    [[[objectPicker subviews] objectAtIndex:8] setHidden:YES];

    return ; //will be implemented, but this will return the icons
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    [[[objectPicker subviews] objectAtIndex:0] setHidden:YES];
    [[[objectPicker subviews] objectAtIndex:5] setHidden:YES];
    [[[objectPicker subviews] objectAtIndex:8] setHidden:YES]; 

    if (pickerView == self.timePicker) {
        return [timeList objectAtIndex:row];
    }
    else if(pickerView == self.powerPicker) {
        return [powerList objectAtIndex:row];
    }
}

Ответы [ 2 ]

4 голосов
/ 24 ноября 2010

Вы просто не можете иметь обоих в одном и том же делегате.Решение состоит в том, чтобы реализовать только viewForRow: и вернуть объект UILabel для текстовых столбцов.Установите label.text на строку, которую вы возвращаете в textForRow:.

2 голосов
/ 29 ноября 2010

Созданы разные классы для каждого из сборщиков, каждый из которых содержит своих собственных делегатов.Затем просто импортируйте их в мой класс mainController и инициализируйте их в методе viewDidLoad.

Вот решение, которое я использовал L

=========================== Найдено решение (обходное решение): ===========================

Во-первых, я создал 3 разных класса для моих 3 сборщиков, каждый с разным .xib.Добавил эти 3 средства выбора в класс моего основного контроллера:

// Не забудьте #import "YourClass.h" и создайте его экземпляр в файле .h вашего основного контроллера

objPickerVC = [[ObjectPickerViewController alloc] initWithNibName:@"ObjectPickerViewController" bundle:[NSBundle mainBundle]];
powerPickerVC = [[PowerPickerViewController alloc] initWithNibName:@"PowerPickerViewController" bundle:[NSBundle mainBundle]];
timePickerVC = [[TimePickerViewController alloc] initWithNibName:@"TimePickerViewController" bundle:[NSBundle mainBundle]];

CGRect rect1 = CGRectMake(5, 43, 100, 216); 
objPickerVC.view.frame = rect1;
[self.view addSubview:objPickerVC.view];

CGRect rect2 = CGRectMake(110, 43, 100, 216); 
powerPickerVC.view.frame = rect2;
[self.view addSubview:powerPickerVC.view];

CGRect rect3 = CGRectMake(215, 43, 100, 216);
timePickerVC.view.frame = rect3;
[self.view addSubview:timePickerVC.view];

Таким образом, у меня есть отдельные делегаты для каждого pickerView, что позволяет мне устанавливать их так, как мне нужно.

PS: Для позиционирования важно, чтобы в xib вашего pickerViews вы централизовали их в представлении,Если вы этого не сделаете, то при попытке их позиционирования -> CGRectMake (215, 43 ...), например, не будет в РЕАЛЬНОМ положении (215, 43 ...).Я знаю, это не имеет никакого смысла, но это ужасная ошибка и заставляет вас помещать это в испытания.Измените значение - запустите - измените - запустите, пока не получите правильное значение.

...