質問

iPhoneアプリを書いています。ナビゲーションスタックのビューコントローラから[EditCreatorControllerという名前]、[BMSStringPickerControllerという名前]を表示しています。私はデータを最初のビューに渡し、そのビューを使ってモーダルビューを閉じるためにデータを渡すためのAppleのガイドラインに委任プロトコルなどを作成しました。私はモーダルコントローラから予想されるデータを取り戻し、それを故意に却下することができます。問題は、その時点で、私が元のビューコントローラを取るほとんどすべての行動が

のようなデバッガのエラーにつながります。

- [EditCreatorController PerformSelecter:Inobject:WithObject:]:Deallocation Instance 0x3a647f0

または

- [EditCreatorController TableView:WillSecrectrowatIndexPath:]:割り当て除去インスタンスに送信されたメッセージ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];
}
.

もう一つの奇妙なこと(おそらく手がかり)は、「受信文字列を返す」nslogメッセージを取得し、typelabel.textに割り当て(TypelabelはテーブルビューのラベルへのIboutlet)、そこには表示されません。テーブルがリロードされても。

誰かがいくつかのアイデアを持っていますか?

役に立ちましたか?

解決

delegatedeallocBMSStringPickerControllerをリリースしますか?

他のヒント

あなたの問題を解決することはできませんが、私はピッカーに自分自身を閉じるように伝えることを提案します(代理の方法で)、レスポンダチェーンが免除を正しく処理できるようにする:

[picker dismissModalViewControllerAnimated:YES];
.

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

これが起こると、View DidUnloadがView Controllerで呼び出され、保持している参照をリリースできるようにします。あなたが保持しなかった参照があるならば、それらはビューがアンロードされたときに無効になります。多分これはあなたの症例で起こっていますか?

UIViewControllerリファレンスメモリ管理詳細についてはUiviewControllerメソッド didreceiveivemorywarning:ビューが現在表示されていない場合はビューをリリースしてからViewDIDunloadを呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top