0

私は、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は、すべてのデータを保持する私のシングルトンです。

4

1 に答える 1

1

isEqualToString: を CALayerArray オブジェクトに送信しているため、CALayerArray オブジェクトは isEqualToString: に応答しません。

そのメッセージを意図的に CALayerArray オブジェクトに送信していない可能性があります。代わりに、いくつかの文字列オブジェクトをいくつかの CALayerArray オブジェクトに渡しています。

おそらく、データ構造の配列ポインターの 1 つを誤って CALayerArray に設定した可能性があります。

幸運を

T

于 2012-06-26T16:31:52.087 に答える