2012-08-25 32 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'。 –