Iphone 尝试使用额外选项覆盖initWithFrame
我正在尝试使用不同类型的主题更新UITableViewCell视图。 我有一些主题,但无法让它们正确工作Iphone 尝试使用额外选项覆盖initWithFrame,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我正在尝试使用不同类型的主题更新UITableViewCell视图。 我有一些主题,但无法让它们正确工作 @interface CustomRowBackground : UIView { CGColorRef topStroke; CGColorRef lightColor; CGColorRef darkColor; CGColorRef bottomStroke; //also known as separator CGColorRef borderColor; } - (id)init
@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文件中,我用一个helper方法扩展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]方法的赋值,则该方法有效。如果我允许代码重用,它就会崩溃
有什么想法吗
Ben我在您的程序中看到的一个问题是,您没有对CGColorRefs执行内存管理—假定您启用了它,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);
}
我在您的程序中看到的一个问题是,您没有对CGColorRefs执行内存管理—假定启用了它,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);
}
是的,我确实启用了ARC。什么是非目标C对象?是否在某个地方有它们的列表,以便我知道哪些必须手动保留和发布。通过保留?我只知道通过一种方式保留。这是通过为类创建属性实现的。然后我必须在dealloc方法中释放它,对吗?你能给我看看我应该写些什么吗?谢谢Ben@Benstruct objc_对象是一个objc对象,id是struct objc_对象*,它的所有子对象都是objc对象,包括NSObject及其所有子类。块也是objc对象。其他所有的东西都不是Objc对象-C类型、Copeoundation CF类型、CG类型、C++类型是一组小实例类型而不是Objc类型。这个列表是无穷无尽的:对于CGColors,您可以简单地使用CGColorRetain和CGColorRelease。将抛出一个超基本的示例…Ben只需将其IVAR更改为键入UIColor*而不是CGColorRef,这会更简单。@robmayoff true+1,但如果不提供解释,这将难以理解。@Justin,我查看了代码,进行了更多的阅读,发现了一种在cellForRowAtIndexPath中添加CGColorRetain的简单方法。darkColor:CGColorRetain[UIColor COLOR WITHR:70 G:70 B:70 A:1]。CGColor。不太确定我将如何释放它们。到目前为止,这是一个好方法还是我应该坚持你的方法?是的,我确实启用了ARC。什么是非目标C对象?是否在某个地方有它们的列表,以便我知道哪些必须手动保留和发布。通过保留?我只知道通过一种方式保留。这是通过为类创建属性实现的。然后我必须在dealloc方法中释放它,对吗?你能给我看看我应该写些什么吗?谢谢Ben@Benstruct objc_对象是一个objc对象,id是struct objc_对象*,它的所有子对象都是objc对象,包括NSObject及其所有子类。块也是objc对象。其他所有的东西都不是Objc对象-C类型、Copeoundation CF类型、CG类型、C++类型是一组小实例类型而不是Objc类型。这个列表是无穷无尽的:对于CGColors,您可以简单地使用CGColorRetain和CGColorRelease。将抛出一个超基本的示例…Ben只需将其IVAR更改为键入UIColor*而不是CGColorRef,这会更简单。@robmayoff true+1,但如果不提供解释,这将难以理解。@Justin,我查看了代码,进行了更多的阅读,发现了一种在cellForRowAtIndexPath中添加CGColorRetain的简单方法。darkColor:CGColorRetain[UIColor COLOR WITHR:70 G:70 B:70 A:1]。CGColor。不太确定我将如何释放它们。到目前为止,这是一个好的方法还是我应该坚持你的方法?它给了我一个错误是没有帮助的。什么错误?它给我一个错误是没有帮助的。什么错误?