私は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です)に割り当てても、そこに表示されないことです。テーブルをリロードします。
誰かアイデアがありますか?