0

呼び出される理由 message sent to deallocated instance 0xebba1b0は理解できます。これは、メモリに存在しなくなったオブジェクトにメッセージを送信しているためです。

これが私のシナリオです。UITableViewを含むZoomedViewControllerがあります。UITableViewにはカスタムUITableViewCellがあり、サブビューとして属性付きラベルがあります。属性付きラベルでリンクが押されると(これによりdidSelectRowAtIndexPathがトリガーされます)、MainViewControllerに委任され、MainViewControllerのメソッドcloseZoomedImageVCが呼び出されます。

-(void) closeZoomedImageVC
{
    [self.zoomedImageContainer_ removeFromParentViewController];
    [self.zoomedImageContainer_.view removeFromSuperview];
}

問題は、そのdidSelectRowAtIndexPathがトリガーされたときに、zoomedImageContainer_がすでになくなっていることです。では、どうすればこれを解決できますか?

ポイントをよりよく説明するために、基本的に私がするとき:

 [self performSelector:@selector(closeZoomedImageVC) withObject:nil afterDelay:1.0];

これはもうクラッシュを引き起こしませんが、ハッキーなのでこれは解決策ではありません。これにより、割り当てが解除される前に、didSelectRowAtIndexPathが最初に実行されます。

4

3 に答える 3

2

あなたへの参照を保存しUITableViewますZoomedViewController

@property (nonatomic, strong) IBOutlet UITableView *tableView;

必ずInterfaceBuilderでコンセントを接続してください。これで、zoomedImageContainer_.viewが削除されると、UITableViewその参照も解放するまで、割り当てが解除されません。

また、へのstrong参照を保存する必要があります。これは、選択した行をに保存した後でのみに設定してZoomedViewControllerください。MainViewControllernilMainViewController

于 2012-08-30T03:53:39.640 に答える
0

テーブル内のセルをタップすると、選択したセルを強調表示するアニメーションが呼び出され、短時間で完了する必要があるため、最善の方法は、実行していることです。遅延後にセレクターを実行します。0.5秒で十分だと思います。

于 2012-08-30T04:09:07.990 に答える
0

私自身の解決策は、tableViewプロパティでallowSelection=NOを設定することです。これにより、UITableViewCell内のattributedLabelが相互作用できるようになりますが、呼び出されるdidSelectRowAtIndexPathが無効になります

于 2012-08-30T04:11:32.887 に答える