2012-03-27 69 views
1

我想爲我的應用程序創建一個「設置」表格視圖。我試圖模仿它與Iphone上的葬禮設置相同的風格。我通過繼承自UITableCell創建了自己的自定義單元類。我給了它適當的IBOulets,並將它們連接到故事板。我也將開關連接到我的tableViewControler,但由於某種原因,我的代碼只返回一個空單元格(它只是一個單元格不是問題atm,因爲這是我的設置)。我三重檢查,並確保我在我的代碼和故事板中使用了相同的單元格標識符。任何人都知道我爲什麼要回空白細胞?IOS靜態表格與自定義單元格只繪製一個隨機單元格

這是我的自定義單元格的.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; 
} 

回答

8

兩個問題:如果使用的是靜態的細胞

  • ,不要在你的視圖控制器(numberOfRows,numberOfSections,cellForRow ...)中實現任何數據源方法,因爲這將覆蓋你在故事板中創建的內容。該表格包含您在故事板中提供的部分,行和內容。
  • 使用initWithCoder:而不是initWithStyle:來初始化從故事板加載的單元格(動態原型或靜態單元格)。 awakeFromNib:是放置代碼的好地方。
+0

工作。謝謝。 – user597608 2012-03-27 06:22:38

+0

你能提供一些關於如何使用initWithCOder的代碼嗎?與awakeFromNib相同。我很抱歉不得不問,但是這個代碼很快就會到期,我害怕破壞atm功能。 – user597608 2012-03-27 06:24:41

+0

這只是一個標準的init方法,self = [super initWithCoder:aDecoder];如果(自己)等等awakeFromNib也是一種標準方法。我不知道我能給你什麼樣的樣品? – jrturton 2012-03-27 06:37:13

0

dequeueReusableCellWithIdentifier:僅適用於已經創建單元以防止重複的內存分配。如果不先創建它,則無法重複使用該單元格。在xib中創建的靜態單元格是默認類型。這就是爲什麼它不適用於具有自定義單元格的靜態表格。增加該小區創建代碼重用後,你已經在你的自定義視圖控制器的cellForRowAtIndexPath:方法來完成:

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

編輯 -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]; 
} 
+0

您誤解了我的問題。我的問題是從我的帖子頂部的第一個.m文件中的代碼,而不是底部的。底部的那個完美地工作。您提供的代碼塊已經存在於我的代碼中。或者我誤解了你的評論? – user597608 2012-03-27 05:56:29

+0

我更改了自己的帖子以包含「我的問題代碼在這裏」以指定我有興趣修復的區塊。 – user597608 2012-03-27 05:57:59

相關問題