Статическая таблица IOS с пользовательской ячейкой рисует только случайную ячейку - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь создать табличное представление «Настройки» для своего приложения.Я пытаюсь имитировать его в том же стиле, что и общие настройки на Iphone.Я создал свой собственный класс ячеек, наследуя от UITableCell.Я дал ему соответствующие IBOulets, и я подключил их в раскадровке.Я также подключил коммутатор к своему tableViewControler, но по какой-то причине мой код возвращает мне только одну пустую ячейку (то, что только одна ячейка не является проблемой, поскольку это все, что у меня есть в моих настройках).Я трижды проверил и убедился, что я использую один и тот же идентификатор ячейки в своем коде и в раскадровке.Кто-нибудь знает, почему я получаю пустую ячейку обратно?

Вот мой файл .h для моей пользовательской ячейки.

@interface NHPSettingsCell : UITableViewCell
@property (nonatomic,weak) IBOutlet UILabel *settingLabel;
@property (nonatomic,strong) IBOutlet UISwitch *settingSwitch;
@end

МОЙ код проблемы здесь, мой файл .h дляПользовательская ячейка:

#import "NHPSettingsCell.h"

@implementation NHPSettingsCell
@synthesize  settingLabel, settingSwitch;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

Мой метод рисования ячейки в моем контроллере пользовательского представления:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SettingsCell";
    NHPSettingsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[NHPSettingsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.selectionStyle = UITableViewCellStyleDefault;
    }
    cell.settingLabel.text = @"firstSetting";

    //check the if user wants promt of disclaimer each time or not.
    if([prefs boolForKey:@"firstSetting"] == YES){
        cell.settingSwitch.on = YES;
    }else{
        cell.settingSwitch.on = NO;
    }

    return cell;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"InteractionResultCell";
    NHPResultCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    // Configure & Fill the cell
    cell.leftLabel.text = [[resultsList objectAtIndex:indexPath.row] substanceName];
    cell.rightLabel.text = [[resultsList objectAtIndex:indexPath.row] substanceName2];
    NSString *color = [NSString stringWithFormat:@"%@", [[resultsList objectAtIndex:indexPath.row] color]];

    //Change a hex value to a readable 0x number to pass ot hte macro so we can go from a hex color to a RGB system.
    NSScanner *scanner;
    unsigned int tempint=0;    
    scanner = [NSScanner scannerWithString:color];
    [scanner scanHexInt:&tempint];

    cell.severityButton.backgroundColor = UIColorFromRGB(tempint);


    return cell;
}

Ответы [ 2 ]

8 голосов
/ 27 марта 2012

Две проблемы:

  • Если вы используете статические ячейки, не реализуйте никакие методы источника данных в вашем контроллере представления (numberOfRows, numberOfSections, cellForRow ...), поскольку это переопределит то, что вы встроили в раскадровку. В таблице есть разделы, строки и контент, который вы даете в раскадровке.
  • Ячейки, загруженные из раскадровки (либо динамические прототипы, либо статические ячейки), инициализируются с использованием initWithCoder:, а не initWithStyle:. awakeFromNib: - лучшее место для установки вашего кода настройки.
0 голосов
/ 27 марта 2012

dequeueReusableCellWithIdentifier: работает, только если ячейка уже была создана для предотвращения повторного выделения памяти.Вы не можете повторно использовать ячейку, не создав ее сначала.Статические ячейки, созданные в xib, являются типом по умолчанию.Вот почему это не работает для статической таблицы с пользовательскими ячейками.Добавьте код создания ячейки после повторного использования, как вы это сделали в методе cellForRowAtIndexPath: вашего контроллера представления:

if (cell == nil) {
    cell = [[NHPSettingsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellStyleDefault;
}

EDIT- В init вашей пользовательской ячейке, вы будетедолжен загружаться с xib.Добавьте следующий метод класса к вашему NHPSettingsCell.m:

+(NHPSettingsCell*) createTextRowWithOwner:(NSObject*)owner{
   NSArray* wired = [[NSBundle mainBundle] loadNibNamed:@"NHPSettingsCell" owner:owner options:nil];
   NHPSettingsCell* cell = (NHPSettingsCell*)[wired firstObjectWithClass:[NHPSettingsCell class]];

   return cell;
}

и затем вызовите его из своего пользовательского контроллера представления как:

cell = (NHPSettingsCell*)[tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
if (Nil == cell) {
     cell = [NHPSettingsCell createTextRowWithOwner:self];
}
...