私は、NavigationControllerによってフォーカスが渡されるいくつかのUIViewControllerで構成されるメニューシステムを持っています。これらのコントローラーのほとんどは、CoursesManager <-(UIViewControllerではない)と呼ばれる私のゲームのコースの管理を担当するシングルトンを参照します(操作しない場合)。作成および編集システムは正常に機能しますが、UIViewControllerの1つで一部のラベルを更新しようとすると、データが失われたり、コースの空の(ジャンクデータ)配列を受け取ったりして、CoursesManagerからクラッシュが発生するという問題が発生し続けます。このデータの損失は、特定の「問題」(UIViewController *)ProblemViewControllerの次のメソッドのいずれかで常に検出されます:viewDidAppear、viewWillAppear、viewDidDisappear、およびviewWillDisappear。
私の理論では、ProblemUIViewControllerがデータにアクセスしようとしたときに、データが別のUIViewControllerによって使用されているため、データが不良になっています。ただし、これをテストまたは修正する方法はよくわかりません。私は、iPhoneプログラミング全般でスレッド化がどのように機能するかについて少しぼんやりしています。また、ProblemUIViewControllerはNavigationControllerスタックの一番下にあるため、これが当てはまるように思われます。
どんな助けでも大歓迎です。
編集 これが私が得ているエラーメッセージです。
-[CALayerArray isEqualToString:]:認識されないセレクターがインスタンス0x2d31a0に送信されました
*キャッチされなかった例外'NSInvalidArgumentException'が原因でアプリを終了します、理由:'-[CALayerArray isEqualToString:]:認識されないセレクターがインスタンス0x2d31a0に送信されました0x343cb 0x3257c3fd 0x32064e07 0x32064dc3 0x32064da1 0x32064b11 0x32065449 0x3206392b 0x32063319 0x32049695 0x32048f3b 0x316d022b 0x325f6523 0x325f64c5 0x325f5313 0x325784
この例外は、コードがこの関数に入るときにスローされます。
-(void)viewWillAppear:(BOOL)animated {[self refreshCourses]; [自己toggleEditMode:NO]; }
-(void)refreshCourses {structSCourse*コース=[coursesManagerGetAllCourses];
for(int i = 0; i < MAX_COURSES; ++i) { // deactivate all buttons/labels courseButtons[i].hidden = YES; courseLabels[i].hidden = YES; deleteButtons[i].hidden = YES; // remake with current data if(courses[i].inUse == YES) { switch (courses[i].size) { case 1: [courseButtons[i] setImage:[UIImage imageNamed:@"sm_coursename_BG.png"] forState:UIControlStateNormal]; break; case 2: [courseButtons[i] setImage:[UIImage imageNamed:@"med_coursename_BG.png"] forState:UIControlStateNormal]; break; case 4: [courseButtons[i] setImage:[UIImage imageNamed:@"lg_coursename_BG.png"] forState:UIControlStateNormal]; break; default: break; } courseLabels[i].text = courses[i].name; // exception thrown here on second iteration of loop with 2 courses to loop through courseLabels[i].hidden = NO; courseButtons[i].hidden = NO; } // if } // for }
-(void)toggleEditMode:(BOOL)bMode {
bEditMode = bMode; if (bMode == YES) { for (int i = 0; i < MAX_COURSES; ++i) { if(courseButtons[i].hidden == NO) { struct SCourse tempCourse = [coursesManager GetCourseAtIndex:i]; courseLabels[i].text = [NSString stringWithFormat:@"(edit) %@", tempCourse.name]; deleteButtons[i].hidden = NO; } } } else // bMode == NO { for (int i = 0; i < MAX_COURSES; ++i) { if (courseButtons[i].hidden == NO) { struct SCourse tempCourse = [coursesManager GetCourseAtIndex:i]; courseLabels[i].text = tempCourse.name; } deleteButtons[i].hidden = YES; } } }
すべてのコースを取得するために呼び出されるシングルトンの方法:
-(struct SCourse *)GetAllCourses{コースを返す; }
CoursesManagerは、すべてのデータを保持する私のシングルトンです。