2012-08-25 46 views
2

我想用不同類型的主題更新UITableViewCell視圖。 我有幾個主題,但不能讓他們正常工作。試圖用額外的選項覆蓋initWithFrame

@interface CustomRowBackground : UIView { 
CGColorRef topStroke; 
CGColorRef lightColor; 
CGColorRef darkColor; 
CGColorRef bottomStroke; //also known as separator 
CGColorRef borderColor; 
} 

- (id)initWithFrame:(CGRect)frame topStroke:(CGColorRef)top lightColor:(CGColorRef)light darkColor:(CGColorRef)dark bottomStroke:(CGColorRef)bottom borderColor:(CGColorRef)border; 
@end 

- (id)initWithFrame:(CGRect)frame topStroke:(CGColorRef)top lightColor:(CGColorRef)light darkColor:(CGColorRef)dark bottomStroke:(CGColorRef)bottom borderColor:(CGColorRef)border 
{ 
    self = [super initWithFrame:frame]; 
if (self) { 
    // Initialization code 
    topStroke = top; 
    lightColor = light; 
    darkColor = dark; 
    bottomStroke = bottom; 
    borderColor = border; 



} 
return self; 
} 
在我的UIViewController,.h文件中

現在,我有一個輔助方法擴展的UIColor類

@interface UIColor (BIExtras) 
+(UIColor *)colorWithR:(CGFloat)red G:(CGFloat)green B:(CGFloat)blue A:(CGFloat)alpha; 
@end 

然後在.M我寫這篇

@implementation UIColor (BIExtras) 
+(UIColor *)colorWithR:(CGFloat)red G:(CGFloat)green B:(CGFloat)blue A:(CGFloat)alpha { 
return [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:alpha];  
} 
@end 

然後我試着爲特定行設置所需的漸變。

TaskDisplayCell *cell = (TaskDisplayCell *)[self.tableView dequeueReusableCellWithIdentifier:TaskCellIdentifier]; 
if (indexPath.row == 0) { 
    cell.backgroundView = [[CustomRowBackground alloc] initWithFrame:CGRectMake(0,0,self.tableView.bounds.size.width,40) 
topStroke:[UIColor colorWithR:119 G:119 B:119 A:1].CGColor 
lightColor:[UIColor colorWithR:92 G:92 B:92 A:1].CGColor 
darkColor:[UIColor colorWithR:70 G:70 B:70 A:1].CGColor 
bottomStroke:[UIColor colorWithR:76 G:76 B:76 A:1].CGColor 
borderColor:[UIColor colorWithR:110 G:110 B:110 A:1].CGColor]; 
} 

注意:我不確定是否這樣做。我只是想用不同的漸變主題來初始化背景。

無論如何,它給了我一個錯誤。如果我手動在drawRect中寫入[UIColor colorWith]方法的分配,則該方法有效。如果我反而允許重用代碼,它會崩潰。

任何想法?

+0

「它給了我一個錯誤」沒有幫助。什麼錯誤? – jrturton

回答

0

一個問題,我在你的程序看到的是,你不執行你的CGColorRef秒的內存管理 - ARC(假設已啓用此功能),你不管理非ObjC對象。您必須手動保留並釋放這些內容。因此,在ARC和MRC中,您必須手動保留並釋放這些內容。

這是基本形式:

@interface CustomRowBackground : UIView { 
    CGColorRef color; 
} 

- (id)initWithFrame:(CGRect)frame color:(CGColorRef)pColor; 

@end 

- (id)initWithFrame:(CGRect)frame color:(CGColorRef)pColor 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     color = CGColorRetain(pColor); 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    CGColorRelease(color), color = 0; 
// [super dealloc]; if MRC 
} 

- (CGColorRef)color 
{ 
    return color; 
} 

- (void)setColor:(CGColorRef)p 
{ 
    if (color == p) { 
     return; 
    } 
    CGColorRef prev = color; 
    color = CGColorRetain(p); 
    CGColorRelease(prev); 
} 
+0

是的,我確實啓用了ARC。什麼是非客觀的C對象?有沒有它們的列表,所以我知道哪些必須手動保留和釋放。通過保留?我只通過一種方式知道保留。這是通過爲該課程創建一個屬性。那麼我將不得不在dealloc方法中釋放它,對吧?你能告訴我應該寫什麼嗎?謝謝,Ben – Ben

+0

@Ben'struct objc_object'是一個objc對象,'id'是'struct objc_object *',它的所有後代都是objc對象 - 包括'NSObject'及其所有子類。塊也是objc對象。其他東西都不是objc對象-C類型,CoreFoundation(CF)類型,CG類型,C++類型是一小組不是objc類型的示例類型。該列表是無窮的:)對於'CGColor',你可以簡單地使用CGColorRetain和CGColorRelease。將拋出一個超基本的例子... – justin

+2

這將是更簡單的只是改變他的ivars鍵入'UIColor *'而不是'CGColorRef'。 –