2

私はiPhoneアプリを書いています。ナビゲーションスタックのビューコントローラー[EditCreatorController]から始めて、カスタムモーダルビューコントローラー[BMSStringPickerController]を紹介します。データを最初のビューに戻し、そのビューを使用してモーダルビューを閉じるための、Appleガイドラインに従ってデリゲートプロトコルなどを作成しました。モーダルコントローラーから期待されるデータを取り戻すこともでき、それをうまく却下することができます。問題は、その時点で、元のView Controllerに対して実行するほとんどすべてのアクションが、次のようなデバッガーエラーにつながることです。

-[EditCreatorController PerformSelector:withObject:withObject:]:割り当て解除されたインスタンス0x3a647f0に送信されたメッセージ

また

-[EditCreatorController tableView:willSelectRowAtIndexPath:]:割り当て解除されたインスタンス0x3c12c40に送信されたメッセージ

つまり、モーダルビューが表示されている間に、元のビューコントローラが蒸発したように見えます。これは、2つのデリゲートコールバックのどちらが呼び出されても当てはまります。

モーダルビューを呼び出す親コントローラーからのコードは次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 1) { // selection on creator type row

    // create a string picker to choose new creator type from list
    BMSStringPickerController *picker = [[BMSStringPickerController alloc] initWithNibName:@"BMSStringPickerController" bundle:nil];
    picker.delegate = self;
    picker.stringChoices = [NSArray arrayWithObjects:@"composer", @"lyricist", @"arranger", @"original artist", @"other", nil];
    picker.currentChoice = creator.type;
    picker.title = @"Creator Type";

    // wrap it in a nav controller so we can get tile bar etc. (from VC prog guide p. 93)
    UINavigationController *newNavigationController = [[UINavigationController alloc]
                                                    initWithRootViewController:picker];

    [self.navigationController presentModalViewController:newNavigationController animated:YES];
    [newNavigationController release];
    [picker release];

 }
}

そして、ここにデリゲートコールバックがあります:

 - (void)stringPickerController:(BMSStringPickerController *)picker didPickString:(NSString *)string {
NSLog(@"received string back: %@", string);
typeLabel.text = string; // only change the label for now; object only changes if done button pressed
[self.tableView reloadData];
[self dismissModalViewControllerAnimated:YES];
}

- (void)stringPickerControllerDidCancel:(BMSStringPickerController *)picker {
NSLog(@"picker cancelled");
[self dismissModalViewControllerAnimated:YES];
}

もう1つの奇妙なこと(おそらく手がかり)は、「受信した文字列が返される」NSLogメッセージを受け取り、それをtypeLabel.text(typeLabelはテーブルビューのラベルへのIBOutletです)に割り当てても、そこに表示されないことです。テーブルをリロードします。

誰かアイデアがありますか?

4

3 に答える 3

2

Maybe you release the delegate in dealloc of BMSStringPickerController?

于 2010-07-11T20:14:13.627 に答える
1

問題が解決しない場合もありますが、ピッカーに(デリゲートメソッドで)自分自身を却下するように指示して、レスポンダーチェーンが却下を正しく処理できるようにすることをお勧めします。

[picker dismissModalViewControllerAnimated:YES];
于 2010-07-11T20:57:43.017 に答える
1

メモリ警告がある場合のデフォルトの動作は、表示されていないすべてのViewControllerのビューを解放することです。したがって、モーダルビューコントローラでメモリ警告が発生した場合、その親ビューコントローラでビューがアンロードされる可能性があります。

これが発生すると、ビューコントローラでviewDidUnloadが呼び出され、ビューに保持している参照を解放できます。保持しなかった参照がある場合、ビューがアンロードされるとそれらは無効になります。多分これはあなたの場合に起こっていますか?

詳細については、UIViewControllerリファレンスのメモリ管理のセクションを参照してください。UIViewControllerメソッドdidReceiveMemoryWarning:ビューが現在表示されていない場合はビューを解放してから、viewDidUnloadを呼び出します。

于 2010-07-11T20:58:41.640 に答える