我正在做一些绘图并且有一个名为Draw2DHelper
的类,它为我正在制作的绘图类型定义了enum
个常量,以及一个使用这些类型的属性drawingType
:
enum {
LINE_DRAWING,
BEZIER_PATH_DRAWING,
FRACTAL_DRAWING,
POINT_DRAWING
};
typedef NSNumber * drawingTypes;
@property drawingTypes drawingType;
在前一个场景中,我正在定义一个UIPickerView来反映我的绘图类型,并用这个代码填充绑定到它的数组(这就是我使用NSNumber的原因): 我现在已经将问题追溯到了选择器及其返回数据的方式。我的父ViewController中有以下代码:
NSNumber *myNum1 = [NSNumber numberWithInt:BEZIER_PATH_DRAWING];
NSNumber *myNum2 = [NSNumber numberWithInt:LINE_DRAWING];
NSNumber *myNum3 = [NSNumber numberWithInt:POINT_DRAWING];
NSNumber *myNum4 = [NSNumber numberWithInt:FRACTAL_DRAWING];
_nameArray = [[NSArray alloc] initWithObjects: @"Bezier Path", @"Line Drawing", @"Point Drawing", @"Fractal Drawing", nil];
_typeArray = [[NSArray alloc] initWithObjects: myNum1, myNum2, myNum3, myNum4,nil];
所以稍后,在pickerView didSelectRow方法中我有这个:
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent: (NSInteger)component
{
if (component == 0)
{
_drawingType = [_typeArray objectAtIndex: row];
NSString *drawingTypeName = [ _nameArray objectAtIndex:row ] ;
}
}
当_drawingType被分配时,会发生一些时髦的事情;我不确定我的指针是否正确...我正在使用字符串来填充选择器的视觉效果 - 我应该使用它们来使比较更容易吗?我究竟做错了什么? 我想我可能没有正确地将数组绑定到选择器,因此didSelectRow方法没有返回正确的数据。思考?建议?
答案 0 :(得分:4)
没有看到任何理由,为什么它必须是NSNumber对象,只需使用整数
enum {
LINE_DRAWING,
BEZIER_PATH_DRAWING,
FRACTAL_DRAWING,
POINT_DRAWING
};
typedef NSInteger drawingTypes;
switch (self.drawingType) //is this inside -create…? that uses type instead
{
case POINT_DRAWING:
// do something
break;
case BEZIER_PATH_DRAWING:
// do something
break;
default:
[self drawRandomSetOfSquaredBezierPaths: (UIBezierPath*) path :(int) maxPoints];
break;
}
typedefed枚举是一种C技术,对象位于Objective-C层。他们不太适合。
同时查看- (void) createDrawing: (drawingTypes) type : (UIBezierPath*) path :(int) maxPoints
我必须相信,您打算为参数(LINE_DRAWING| BEZIER_PATH_DRAWING)
传递type
之类的位掩码。你只能使用C整数来做到这一点。
答案 1 :(得分:4)
我认为@ vikingosegundo的答案是要走的路,但只是回答原来的问题:
如果你这样定义你的枚举:
enum {
LINE_DRAWING,
BEZIER_PATH_DRAWING,
FRACTAL_DRAWING,
POINT_DRAWING
};
typedef NSNumber * drawingTypes;
然后,您可以使用Objective-C literals
将NSNumber对象与枚举进行比较NSNumber *number = (wherever your number comes from)
if ([number isEqualToNumber:@(LINE_DRAWING)]) {
}
与[number isEqualToNumber:[NSNumber numberWithInteger:LINE_DRAWIN]])
答案 2 :(得分:2)
您的绘图类型需要为int值。不是对象(NSNumber)。
代码应写如下。
typedef enum {
LINE_DRAWING,
BEZIER_PATH_DRAWING,
FRACTAL_DRAWING,
POINT_DRAWING
} DrawingType;
@property(nonatomic) DrawingType drawingType;
- (void) createDrawing: (DrawingType) type : (UIBezierPath*) path :(int) maxPoints
{
switch (type)
{
case POINT_DRAWING:
// do something
break;
case BEZIER_PATH_DRAWING:
// do something
break;
default:
[self drawRandomSetOfSquaredBezierPaths: (UIBezierPath*) path :(int) maxPoints];
break;
}
}