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のようなビットマスクを渡すつもりだったと信じなければなりません。これは、C 整数でのみ行うことができます。(LINE_DRAWING| BEZIER_PATH_DRAWING)type

于 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 に答える