2

iPhone でこのメソッドinsertSubview:atIndex:を使用すると、プログラムの実行に失敗し、main.m ファイルに EXC_BAD_ACCESS が含まれます。ただし、presentModalViewControllerプログラムを使用すると、完全に実行されます。

また、メソッド switchToView は、最初に使用されたときに機能し、to と from が異なりますが、2 回目は機能しません。

何がうまくいかないのですか?

これが私のコードです:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{    
  ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];
  [self switchToView:sbd from:self];
}

私の方法は次のようになります:

-(void)switchToView:(UIViewController*)nextView from:(UIViewController*)currentView
{
  [currentView.view insertSubview:nextView.view atIndex:1];
}
4

3 に答える 3

5

ビュープロパティをここで見てください

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

それは私がコメントで述べたことを厳密に述べています:

「各ViewControllerオブジェクトは、そのビューの唯一の所有者です。同じViewObjectを複数のViewControllerオブジェクトに関連付けないでください。このルールの唯一の例外は、コンテナViewControllerの実装がこのビューを独自のサブビューとして追加する場合があることです。ビュー階層。サブビューを追加する前に、コンテナは最初にそのaddChildViewController:メソッドを呼び出して、2つのViewControllerオブジェクト間に親子関係を作成する必要があります。」

アップルから直接!

于 2012-06-22T12:58:42.363 に答える
0
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

[self switchToView:sbd from:self.view];
}

-(void)switchToView:(UIViewController*)nextView from:(UIView*)currentView{
[currentView insertSubview:nextView.view atIndex:1];
}

このコードに変更します

于 2012-06-22T13:10:24.363 に答える
0

これは問題です:

ShowBookDetails *sbd = [[ShowBookDetails alloc] initWithNibName:@"ShowBookDetails" bundle:nil];

ARC を使用していない場合、その行を含むメソッドが終了するとオブジェクトを解放する方法がないため、メモリ リークです。

ARC を使用している場合、ARC は自動的に解放さsbdれ、そのビュー内でコントローラーを参照するものはすべて、解放されたオブジェクトを使用しようとします。

ShowBookDetails *sbdローカル変数ではなく、このクラスで強力な (または保持する) プロパティを作成する必要があります。

于 2012-06-22T13:14:54.730 に答える