0

NSMutableDictionaryキーと値のペアでいくつかのアイテムを保持するがあります。キー付きの文字列を保存して問題なく取得しましたが、typeの値を保存NSUIntegerして辞書から取得しようとすると、非常に大きな値になってしまいます。

ifステートメントの最初の部分で、探している値がnullでないか、ゼロより大きいかどうかを確認します。基本的に、アクセスできる辞書にスコアまたは値を保持して、追加または削除できるようにしようとしています。

elseステートメントでわかるように、2つのNSLogステートメントがあります。ここで、値の違いがわかります。最初のNSLogステートメントは、「ハッピー」ボタンをクリックすると予想されるように、100の値を表示します。ただし、値がディクショナリから取得されると、currentTotalは109709424になります。これは、この整数値を文字列に変換する際に使用しているフォーマット指定子と関係があると確信しています。この値currentTotalを、辞書の「Total」キーの下にintまたはNSUIntegerとして格納しようとしましたが、非Objective-cタイプのオブジェクトから「id」への変換がARCで許可されていないため、スタックします。

NSUInteger currentTotal = 0;
NSUInteger happinessValue = 100;
NSUInteger sadnessValue = 20; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    if ([appDelegate.data valueForKey:@"Total"] != nil || [appDelegate.data valueForKey:@"Total"] > 0) {

        currentTotal = (int)[appDelegate.data valueForKey:@"Total"];

        if ([segue.identifier isEqualToString:@"Happy"]) {
            [segue.destinationViewController setHappiness:(int)happinessValue :segue.identifier];
            currentTotal = add(currentTotal, happinessValue);

            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", happinessValue] forKey:@"Value"];
        } else if ([segue.identifier isEqualToString:@"Sad"]) {
            [segue.destinationViewController setHappiness:(int)sadnessValue :segue.identifier];
            currentTotal -= [segue.destinationViewController setTotalValue:happinessValue];
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", sadnessValue] forKey:@"Value"];
        }
    }
    else {

        if ([segue.identifier isEqualToString:@"Happy"]) {
            [segue.destinationViewController setHappiness:(int)happinessValue :segue.identifier];
            NSLog(@"Old value ELSE: %i", currentTotal);
            currentTotal = [segue.destinationViewController setTotalValue:happinessValue];
            NSLog(@"New value ELSE: %i", currentTotal);
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", happinessValue] forKey:@"Value"];
        } else if ([segue.identifier isEqualToString:@"Sad"]) {
            [segue.destinationViewController setHappiness:(int)sadnessValue :segue.identifier];
            currentTotal = [segue.destinationViewController setTotalValue:happinessValue];
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", sadnessValue] forKey:@"Value"];
        }

        NSLog(@"Current Total: %i", currentTotal);
        [appDelegate.data setObject:[NSString stringWithFormat:@"%d", currentTotal] forKey:@"Total"];
        NSLog(@"Total stored: %i", (int)[appDelegate.data valueForKey:@"Total"]);
    }

}
4

1 に答える 1

2

これは問題のように見えます:

currentTotal = (int)[appDelegate.data valueForKey:@"Total"];

-valueForKey:ではなく、Objective-C オブジェクトへのポインタを返すため、これを にキャストして何か有用なことが起こると期待するintことはできません。intの場合はNSNumber、次のようにする必要があります。

currentTotal = [[appDelegate.data valueForKey:@"Total"] intValue];

詳細については、ドキュメントをNSNumber参照してください。

于 2012-06-15T21:05:12.403 に答える