1

我正在做一些绘图,并有一个名为的类,它为我正在制作的绘图类型Draw2DHelper定义一个常量,以及一个使用这些类型的属性:enumdrawingType

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 方法没有返回正确的数据。想法?建议?

4

3 回答 3

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 enums 是一种 C 技术,对象存在于 Objective-C 层。他们不太适合在一起。

也看看- (void) createDrawing: (drawingTypes) type : (UIBezierPath*) path :(int) maxPoints我不得不相信,你的意思是传递一个像(LINE_DRAWING| BEZIER_PATH_DRAWING)for parameter这样的位掩码type。你只能用 C 整数来做到这一点。

于 2013-03-04T02:51:15.660 回答
4

我认为@vikingosegundo的答案是要走的路,但只是为了回答原来的问题:

如果你这样定义你的枚举:

enum {
    LINE_DRAWING,
    BEZIER_PATH_DRAWING,
    FRACTAL_DRAWING,
    POINT_DRAWING
};
typedef NSNumber * drawingTypes;

然后,您可以使用Objective-C 文字将 NSNumber 对象与枚举进行比较

NSNumber *number = (wherever your number comes from)
if ([number isEqualToNumber:@(LINE_DRAWING)]) {
}

这与[number isEqualToNumber:[NSNumber numberWithInteger:LINE_DRAWIN]])

于 2013-03-04T03:00:41.363 回答
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;
    }

}
于 2013-03-04T02:59:20.537 回答