12

私のアプリケーションでは、CGRectオブジェクトをに格納しようとしていNSMutableArrayます。正常に読み込まれ、ログステートメントに出力されますがCGRect、配列からsを取得しようとすると、エラーが表示されます。コードスニペットは次のとおりです。

CGRect lineRact = CGRectMake([[attributeDict objectForKey:@"x"] floatValue], 
  [[attributeDict objectForKey:@"y"] floatValue], 
  [[attributeDict objectForKey:@"width"] floatValue], 
  [[attributeDict objectForKey:@"height"] floatValue]);

  [lineRactangle addObject:NSStringFromCGRect(lineRact)];

どうすれば配列からrectsを取り戻すことができますか?

4

7 に答える 7

42

CGRect はオブジェクトではなく構造体であるため、NSArray または NSDictionaries に格納することはできません。それを文字列に変換し、その文字列を CGRect に戻すことができますが、最善の方法は NSValue を介してカプセル化することです。

NSValue *myValue = [NSValue valueWithCGRect:myCGRect];

その後、この NSValue オブジェクトを配列と辞書に格納できます。CGRect に戻すには、次のようにします。

CGRect myOtherCGRect = [myValue CGRectValue];
于 2011-03-25T11:07:40.337 に答える
22
[lineRactangle addObject:[NSValue valueWithCGRect:lineRect]];
于 2011-03-25T11:08:47.580 に答える
7

を使用NSValueしてラップCGRectし、s に格納しますNSArray

例えば:

CGRect r = CGRectMake(1,2,3,4);
NSValue *v = [NSValue valueWithCGRect:rect];
NSArray *a = [NSArray arrayWithObject:v];
CGRect r2 = [[a lastObject] CGRectValue];

サポートされているその他の構造については、ドキュメントを参照してください。

于 2011-03-25T11:08:58.983 に答える
2

実際、これまでのところ、ajayが尋ねた質問に実際に対応している回答はないと思います。簡単な答えは次のとおりです。辞書アイテムのfloatValueではなく、 intValueCGRectMakeに指定する必要があります。複数のCGRectに対してこれを行う必要がある場合は、次の方法をお勧めします。

- (CGRect) NSArrayToCGRect: (NSDictionary *) attributeDict
{
    int x = [[attributeDict objectForKey:@"x"] intValue];
    int y = [[attributeDict objectForKey:@"y"] intValue];
    int w = [[attributeDict objectForKey:@"width"] intValue];
    int h = [[attributeDict objectForKey:@"height"] intValue];

    return CGRectFromString([NSString stringWithFormat: @"{{%d,%d},{%d,%d}}", x, y, w, h]);
}

これを実現するためのより洗練された方法があるかもしれませんが、上記のコードは機能します。

于 2012-07-22T15:17:49.543 に答える
2

オブジェクトを「.frame」で設定できる場合は、次を使用できます。

// {{CGFloat x,CGFloat y}, {CGFloat width,CGFloat height}}
NSString *objectCoords = @"{{116,371},{85,42}}";
myObject.frame = CGRectFromString(objectcoords);

または複数のオブジェクトの場合:

NSArray *objectCoords = [NSArray arrayWithObjects:
                         @"{{116,371},{85,42}}",
                         @"{{173,43},{85,42}}",
                         @"{{145,200},{85,42}}",
                         nil];

myObject1.frame = CGRectFromString([objectCoords objectAtIndex:0]);
myObject2.frame = CGRectFromString([objectCoords objectAtIndex:1]);
myObject3.frame = CGRectFromString([objectCoords objectAtIndex:2]);
于 2012-07-24T22:19:43.083 に答える
0

CGRectは、NSArrayに配置できない構造体です。オブジェクトを追加することしかできません。

于 2011-03-25T11:04:58.797 に答える
0

またはもっと「極端な」もの... CGRectの配列を保持する配列を作成する

movPosTable = [[NSArray alloc] initWithObjects:
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAA frame]], [NSValue valueWithCGRect:[GridAC frame]], [NSValue valueWithCGRect:[GridBA frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil],
            [[NSArray alloc] initWithObjects: [NSValue valueWithCGRect:[GridAB frame]], [NSValue valueWithCGRect:[GridBB frame]], [NSValue valueWithCGRect:[GridBC frame]], nil], nil];

「GridAA」、「GridAB」などはUIViewに対応します

于 2012-02-11T16:41:30.427 に答える