1

請求書を生成するアプリ(私の最初)を作成しようとしています。もともと私の考えは、次のクラスを持つことでした。

  • ユーザー(以下のすべてのアプリケーションデータが属する)
  • 顧客(請求先:名前、会社名、請求先住所、電話番号など)
  • タスク(請求書の項目:名前、説明、HourlyRateなど...)
  • 請求書(顧客と複数のタスクで構成される最終出力)

ユーザーに「新しい顧客の追加」を選択させることができると思いました。これにより、Customerオブジェクトが作成され、そのオブジェクトが顧客配列に格納されます。「新しいタスクの追加」と同じことです。これにより、タスクオブジェクトが作成され、タスク配列に追加されます。次に、customer配列の特定の値とtasks配列の複数のタスクを指すInvoiceオブジェクトを作成できます。

私が遭遇している問題は、誰かが「新しい顧客の追加」または「新しいタスクの追加」を押すたびに新しいオブジェクトを作成する方法がわからないことです。私はこのようなことをしようとしました:

Customer *customer = [[Customer alloc] init];
[customer setName:@"John Doe"];
[customer setCompanyName:@"John's Swimming Pools"];

[user1 addCustomer:customer];

[customer setName:@"Jane Smith"];
[customer setCompanyName:@"Cupcakes by Jane"];

[user1 addCustomer:customer];

for (int i = 0; i < [[user1 customers] count]; i++) {
    NSLog(@"%@",[[[user1 customers] objectAtIndex:i] name]);
}

顧客へのポインタがJaneで上書きされているため、これが機能しないことに気付きました。配列が出力されると、両方の値が「JaneSmith」と表示されます。

ユーザーが顧客/タスクを追加することを決定するたびに、オブジェクトへの新しいポインターを作成するにはどうすればよいですか?それとも、これはすべて間違っているので、クラスではなくすべてに配列を使用する必要がありますか?これは非常に基本的なOOPであり、頭を包むのに苦労しているように感じます。どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

1

誰かが押すたびに1人の顧客だけが追加される場合、なぜ同じ場所に2回追加するのですか?顧客を追加するための単純なファクトリメソッドは、顧客クラスで定義できます。最初に、次のようにCustomer.hで宣言します。

+(Customer*)createCustomerWithName:(NSString*)name AndCompany:(NSString*)cp;

次に.mで:

+(Customer*)createCustomerWithName:(NSString*)name AndCompany:(NSString*)cp
{
   Customer *customer = [[Customer alloc] init];
   [customer setName:name];
   [customer setCompanyName:cp];
   return customer;
}

次に、顧客を追加する必要があるときにコードで、次のように呼び出します。

[user1 addCustomer:[Customer createCustomerWithName:@"ALan" AndCompany:@"MS"]];

そして、いつでもそれを呼び出します。あなたの問題は解決されるべきです。

注意:このファクトリメソッドを呼び出すクラスにCustomer.hをインポートする必要があります。

于 2012-06-23T14:12:17.207 に答える
0

これを試して:

Customer *customer = [[Customer alloc] init];
[customer setName:@"John Doe"];
[customer setCompanyName:@"John's Swimming Pools"];

[user1 addCustomer:customer];

[customer release]; // if NOT using ARC
// or "customer = nil;" if using ARC

// now initialize a second customer object
customer = [[Customer alloc] init];
[customer setName:@"Jane Smith"];
[customer setCompanyName:@"Cupcakes by Jane"];

[user1 addCustomer:customer];

[customer release]; // if NOT using ARC; otherwise this won't compile

for (int i = 0; i < [[user1 customers] count]; i++) {
    NSLog(@"%@",[[[user1 customers] objectAtIndex:i] name]);
}

最初の顧客を追加した後の " " について 100% 確信があるわけではありませんがcustomer = nil;(ARC を使用している場合のみ)、重要なことは、2 番目の Customer オブジェクトをインスタンス化する必要があり、それを配列に追加するときに、 2 つの個別の顧客オブジェクトとレコードがあります。

于 2012-06-23T14:03:50.243 に答える