0

重複の可能性:
NSMutableArrayiphoneアプリケーションでNSLogを実行すると実際の値が表示されない

NSMutableArrayを次のように初期化しました。

- (id)init
{
self = [super init];
if (self)
{
    mySpotsArray = [[NSMutableArray alloc]init];
}

return self;
}

配列には、NSTableのデータが次のように格納されます。

//-----------------------------------------
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [mySpotsArray count];

[self saveMySpots];
}


//-----------------------------------------
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn            *)tableColumn row:(NSInteger)row
{
Spot *sp = [mySpotsArray objectAtIndex:row];
NSString *identifier = [tableColumn identifier];
return [sp valueForKey:identifier];

[self saveMySpots];
}



 //-----------------------------------------
 - (void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
Spot *sp = [mySpotsArray objectAtIndex:row];
NSString *identifier = [tableColumn identifier];
[sp setValue:object forKey:identifier];

[self saveMySpots];
}

私は次のようなオブジェクトを追加および削除しています:

//-----------------------------------------
- (IBAction)addSpot:(id)sender
{
[mySpotsArray addObject:[[Spot alloc]init]];
[mySpotsTable reloadData];

[self saveMySpots];
}




//-----------------------------------------
- (IBAction)deleteSpot:(id)sender
{
NSInteger row = [mySpotsTable selectedRow];
[mySpotsTable abortEditing];
if (row !=-1)
{
    [mySpotsArray removeObjectAtIndex: row];
}

[mySpotsTable reloadData];

[self saveMySpots];
}

私は次のように配列コンテンツを保存およびロードしています:

//-----------------------------------------
- (void) saveMySpots
{
savedSpots = [NSUserDefaults standardUserDefaults];
encodedMySpotsArrayObject = [NSKeyedArchiver archivedDataWithRootObject: mySpotsArray];
[savedSpots setObject: encodedMySpotsArrayObject forKey:[NSString stringWithFormat:@"MySpotsArrayKey"]];
}




//-----------------------------------------
- (void) loadMySpots
{
savedSpots = [NSUserDefaults standardUserDefaults];
decodedMySpotsArrayObject = [savedSpots objectForKey: [NSString stringWithFormat:@"MySpotsArrayKey"]];

 mySpotsArray = [NSKeyedUnarchiver unarchiveObjectWithData: decodedMySpotsArrayObject];
}

オブジェクトは次のようにエンコードおよびデコードされます。

//-----------------------------------------
- (id)init
{
self = [super init];
if (self)
{
    _mySpot = @"My Spot";
    _localOffset = 0;
}

return self;
}


//-----------------------------------------
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject: self.mySpot forKey:@"MySpotKey"];
[encoder encodeInt: self.localOffset forKey:@"LocalOffsetKey"];
}



//-----------------------------------------
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if( self != nil )
{
    self.mySpot = [decoder decodeObjectForKey:@"MySpotKey"];
    self.localOffset = [decoder decodeIntForKey:@"LocalOffsetKey"];
}
return self;
}

すべてがこのようにそれぞれの.hで適切に定義されています

NSMutableArray *mySpotsArray;

NSUserDefaults *savedSpots;

NSData *encodedMySpotsArrayObject;
NSData *decodedMySpotsArrayObject;

すべてがUIレベルで完全に機能します。つまり、テーブルが適切に表示、追加、削除、保存、およびロードされます。しかし、私がこのようにNSLogをしようとしているとき:

NSLog(@"%@", mySpotsArray);

私はこれを手に入れます:

2012-09-19 13:41:25.372 Spot[1541:303] (
"<Spot: 0x100674ab0>",
"<Spot: 0x100674c20>",
"<Spot: 0x100675040>"
)

私もこれを試しました:

 NSString *strData = [[NSString alloc]initWithData: decodedMySpotsArrayObject encoding:NSUTF8StringEncoding];

NSLog(@"strData: %@", strData);

そして私はこれを手に入れます:

2012-09-19 13:41:25.371 Spot[1541:303] strData: (null)

NSMutableArrayコンテンツにアクセスして、それを文字列に変換するだけです。UIに表示される実際のコンテンツは、2列3行のテーブルです。

エレバン2
ロンドン-1
ロサンゼルス-9

私は何が間違っているのですか?

ありがとう

4

2 に答える 2

3

これは予想される動作だと思います。

デバッガーは、コンソールに何を出力する必要があるかをどのように認識しますか?オブジェクトのプロパティなど、他の何かを出力する場合は、メソッドSpotを指定する必要があります。Spotdescription

例えば:

#import <Foundation/Foundation.h>

@interface Foo:NSObject {
    NSString *_bar;
}
@property (nonatomic, copy) NSString *bar;
@end

@implementation Foo
@synthesize bar = _bar;

- (NSString *)description {
    return self.bar;
}

@end

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    NSMutableArray *objs = [[NSMutableArray alloc] init];
    Foo *myFoo = [Foo new];
    myFoo.bar = @"Mine";

    Foo *yourFoo = [Foo new];
    yourFoo.bar = @"Yours";

    [objs addObject:myFoo];
    [objs addObject:yourFoo];

    NSLog(@"Objs = %@",objs);

    [p release];
}

これをコンソールに出力します。

2012-09-19 06:57:10.375 Untitled 2[59494:707] Objs = (
    Mine,
    Yours
)

しかし、descriptionメソッドがないと、これがコンソールに出力されます。

2012-09-19 07:01:12.542 Untitled 2[59853:707] Objs = (
    "<Foo: 0x7f9773c080c0>",
    "<Foo: 0x7f9773c0a9b0>"
)
于 2012-09-19T11:59:07.363 に答える
2

このメソッドをSpotクラスに追加します

- (NSString *)description
{
   NSString *str = [[NSString alloc] initWithFormat:@"%@ \n %@ \n%@",Var1,Var2,var3];

   return str;
}

Var1、Var2、Var3を元の変数名に置き換えます。

于 2012-09-19T12:07:05.437 に答える