0

私が達成しようとしているのは、NSMutableArray を AppDelegate で定義することです。次に、2 つの UIViewControllers があります。1 つのビューは、AppDelegate から配列を表示する役割を果たします。もう 1 つのビューは、項目を配列に追加するために使用されます。したがって、配列は最初は空です。配列が空であるため、View1 には何も表示されません。ユーザーは View2 に移動し、AppDelegate の配列に項目を追加します。その後、ユーザーが View1 に戻ると、1 つの項目が表示されます。

これが私がこれを達成しようとしている方法です

@interface CalcAppDelegate : NSObject <UIApplicationDelegate> {
 UIWindow *window;
 UITabBarController *tabBarController;
 NSMutableArray *globalClasses;
}
@property (nonatomic,retain) NSMutableArray *globalClasses;

私のもう一つの見方

viewDidload で、View の配列を AppDelegate の配列に設定しました。価値を維持するための努力。

allCourses = [[NSMutableArray alloc]init];
CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
allCourses = appDelegate.globalClasses;

次に、新しい項目を追加して allCourses 配列を更新します。次に、AppDelegate の配列が変更された配列と等しくなるように設定してみてください。

CalcAppDelegate *appDel = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"Size before reset %d",[appDel.globalClasses count]);
    appDel.globalClasses = allCourses;
    NSLog(@"Size after reset %d",[appDel.globalClasses count]);

私が見ているのは、前に 2 つ、後に 2 つです。そのため、適切に更新されていないようです。助言がありますか?

4

2 に答える 2

2

いくつかのこと:

まず、アプリ デリゲートで、オブジェクトが配列にアクセスしようとする前に配列を初期化する必要があります。これには顧客ゲッターが適しています。

-(void) getGlobalClasses{
    if (globalClasses!=nil) {
        return globalClasses;
    }
    NSMutableArray *newArray=[[NSMutableArray alloc] initWithCapacity:1]; //yes, I'm old school
    self.globalClasses=newArray;
    [newArray release];
    return globalClasses;
}

これで、プロパティへのすべての呼び出しが配列を返すことが保証されます。

ビュー コントローラーでは、配列を保持するプロパティを定義する必要があります。配列はアプリ デリゲートによって保持され、常に存在するため、配列を保持するのではなく、割り当てることをお勧めします。そうすれば、まったく同じ配列に書き込んでいることが常にわかり、アプリのデリゲートはそのライフサイクルを完全に制御できます。

ビューコントローラーで:

@property(nonatomic,assign) NSMutableArray *globalClasses;

それを参照するたびに、必ず自己表記を使用してください。

self.globalClasses=//...whatever

とはいえ、アプリで配列やその他のダムデータオブジェクトをむき出しにすることは、非常に悪い習慣です。コードの各部分が配列に対して何を行うかを制御することはできません。配列にデータを追加または削除するすべての場所で、すべての検証コードを複製する必要があります。

配列をカスタム クラスでラップして保護し、クラス メソッドによってのみ変更できるようにすることをお勧めします。

そのようです:

@interface MyData : NSObject {
@protected
    NSMutableArray *myDataArray;
}

-(void) addObject:(id) anObject;
-(void) removeObjectAtIndex;(NSInteger) anIndex;

@end

スクラッチ.m

@interface scratch ()
@property(nonatomic, retain)  NSMutableArray *myDataArray;

@end

@implementation scratch
@synthesize myDataArray;

-(void) addObject:(id) anObject{
    //...code to check if anObject is a valid one to add to the array
    [self.myDataArray addObject:anObject];
}//------------------------------------addObject:------------------------------------

-(void) removeObjectAtIndex;(NSInteger) anIndex{
    //... do bounds checking and other testing to ensure no problems
    // will result from removing the object at the given idex
    [self.myDataArray removeObjectAtIndex:anIndex];
}//-------------------------------------(void) removeObjectAtIndex;(NSInteger) anIndex------------------------------------

次に、上記のようにカスタム クラスをアプリ デリゲートのプロパティに追加します。これにより、データがクリーンでモジュール化された状態に保たれるため、すべてのオブジェクトで配列を細かく管理する必要なく、さまざまなアプリ reobject で安全に使用できます。

于 2010-04-16T18:06:09.170 に答える
0

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

allCourses = [[NSMutableArray alloc] init];
CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
allCourses = appDelegate.globalClasses;
  1. 既存の配列 (アプリ デリゲート内の配列) を保持したいので、新しい配列を割り当てる必要はありません。
  2. プロパティを使用している場合はself、アプリのデリゲート配列を保持するために宣言を使用する必要があります

代わりに、次を試してください。

CalcAppDelegate *appDelegate = (CalcAppDelegate *)[[UIApplication sharedApplication] delegate];
self.allCourses = appDelegate.globalClasses;
于 2010-04-16T18:06:03.133 に答える