1

簡単な問題を解決するのを手伝ってください。私はobjective-cの初心者で、javaからobjective-cに切り替えたばかりです。私はJavaフェアをよく知っていますが、それほど深くはありません。

私はiPhoneアプリを構築しています。私のアプリはとてもシンプルです。私のiphoneアプリの目的は、レストランで私のiphoneアプリを注文することです。

私のアプリの進捗状況: 私のアプリには現在、いくつかのviewPanelsとボタンしかありません:)これ がのアプリのソースコード、firstviewスクリーンショットとsecondviewスクリーンショットです

問題: [コーヒー]ボタンをクリックすると、textFieldにコーヒーの名前とコーヒーの価格が表示されません。これは「コーヒー1」と表示されるはずです。そしてxcodeは私をiphonesimilatorからデバッガーに連れて行きます。コーヒーボタンを押すと、xcodeがデバッガーに移動します。

コーヒーボタンを押した後、画面が右に表示されます

これがコーヒーボタンのアクションコードです

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];               // i assume the program crush at here when it look into setName method.
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:     // the program not even hit this line yet before crush;
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

以下のコードは、顧客が注文したすべてのアイテムを格納するストレージクラスです。これは2次元配列であり、MyStoragesクラスはStorageクラスのラッパークラスです。配列形式は次のようになります。

arrayindex1->名前、価格

arrayindex2->名前、価格

arrayindex3->名前、価格

arrayindex4->名前、価格

Storage.h

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

Storage.m

#import "Storage.h"

@implementation Storage

@synthesize name;         // program crush and goes to here.
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

Storages.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

Storages.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

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

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end
4

4 に答える 4

1

ここにはいくつかの問題があります。

1)価格プロパティにポインタを使用しないでください。一般に、何か変わったことをしているのでない限り、オブジェクトであるプロパティはポインターになり、プリミティブ(NSInteger、BOOL、floatなど)であるプロパティはポインターになりません。

2)注文NSMutableArrayがオブジェクトで初期化されていることを確認する必要がありStoragesます。そうしないと、注文はnilのままになり、オブジェクトを追加しようとしても何も起こりません。を初期化するには、以下に示すようにメソッドNSMutableArrayでこれを行います。init単純なNSLogステートメントをfor (Storage *obj in orders.getOrders) { ... }ループに入れ、ループ全体で少なくとも1回の反復を取得することで、オブジェクトが実際に有効な可変配列に入っていることを確認することもできます。orders.getOrdersがnilの場合、forループの作業ブロックは実行されません。

3)-[NSObject description]Storageオブジェクトのメソッドをオーバーライドする必要があるようです(すでにオーバーライドされている可能性があります)。私の推測では、このメソッドと-[NSString stringWithFormat:...]フォーマット文字列が一致していません。たとえば、のフォーマット文字列で%dまたは%@を使用している場合がありますNSInteger *。そのようなものは間違いなくクラッシュを引き起こす可能性があります(これは、「Xcodeがデバッガーに移動する」という意味だと思います)。NSIntegerの場合、%dまたは%iを使用する必要があります。そして、私や他の人が言ったように、あなたはNSIntegerここが欲しいのではなくNSInteger *、あなたの財産宣言を変更するべきです。

4)あなたがここに持っているものに基づいて、私はあなたがクラスのorderプロパティをまったく必要としないと思います。Storages

5)InterfaceBuilderのIBOutletをchecktextFieldに接続するのを忘れる可能性を見逃していないことを確認してください。これに対する良いテストは、Interface Builderで接続されていることを確認するだけでなく、次のようなリアリティチェックテストになります。[check setText:@"This is a test."];

6)これが機能すると、forループが非常に高速に実行され、orders配列の最後のオブジェクトの説明のみがすぐに表示されることに注意してください。しかし、それはあなたの質問が何であるかではないようです。

次の変更を行うことをお勧めします。

Storage.h

#import <Foundation/Foundation.h>

@interface Storage : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger price;

@end

Storage.m

#import "Storage.h"

@implementation Storage

@synthesize name;
@synthesize price;

- (NSString *)description {
    // example: "coffee 1"
    return [NSString stringWithFormat:@"%@ %d", self.name, self.price];
}

@end

IBActionメソッド

- (IBAction)Coffee:(id)sender {
    int price = 1;
    NSString *name = @"coffee";

    Storage *order = [[Storage alloc] init];
    [order setName:name];
    [order setPrice:price];
    [orders addOrders:order];

    // Sanity check:
    NSLog(@"There are now %d orders in the array.", [orders.getOrders count]);

    for (Storage *obj in orders.getOrders){
        [check setText:[NSString stringWithFormat:@"%@",[obj description]]];  // check is the TextField instant varible. and the description method is from storage.m to print out the name and price.
    }
}

Storages.h

#import <Foundation/Foundation.h>
#import "Storage.h"
@interface Storages : NSObject

@property (nonatomic,strong, readwrite) NSMutableArray *orders;

-(void) addOrders:(Storage *)anOrder;
-(NSMutableArray *) getOrders;

@end

Storages.m

#import "Storages.h"

@implementation Storages
@synthesize orders;

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

-(void) addOrders:(Storage *)anOrder{
    [orders addObject: anOrder];
}
-(NSMutableArray *) getOrders{
    return orders;
}
@end
于 2013-01-30T06:23:58.867 に答える
0

以下の説明は何をしますか?(Storageクラスにdescriptionオブジェクトが表示されません):

[check setText:[NSString stringWithFormat:@"%@",[obj description]]];

名前を印刷したい場合は、次のようにしてください。

[check setText:[NSString stringWithFormat:@"%@: %@",obj.name, obj.price]];
于 2013-01-30T05:14:52.743 に答える
0

正しくないクラスでNSIntegerポインタを取得しました。は基本的なデータ型であり、ポインタではありません。そのポインタを削除し、変数を使用します。これで問題が解決することを願っています。StoragesNSIntegerNSInteger

以下のコードを使用できます。

@interface Storage : NSObject

@property (nonatomic, retain)NSString *name;

@property (nonatomic, assign)NSInteger price;
于 2013-01-30T05:33:57.607 に答える
0

2つの間違いがあります:
1-価格をNSIntegerとして宣言し、それを参照として渡しました。正しいのは、それをそのまま整数として渡し、アプリケーション全体で整数として処理することです。
2- Storagesクラスでorders配列を初期化していないため、常にnilになり、追加されたオブジェクトは保持されません。

コードは次のようになります。

ボタンのIBActionで価格を直接渡します

[order setPrice:price];

Storageクラス内

- (NSString *)description {
    return [NSString stringWithFormat: @"%@        %d", name, price];
}

Storagesクラスに以下を追加します

-(id)init
{
    if (self = [super init])
    {
        orders = [[NSMutableArray alloc] init];
    }
    return self;
}
于 2013-01-30T07:16:29.680 に答える