2012-04-14 97 views
1

iOS中订阅事件的最佳方法是ViewDidLoad,但是在关闭视图时,不会调用ViewDidUnload()(仅当内存警告时)。Monotouch/iOS:哪个地方是取消订阅代理的最佳选择

哪个地方最好取消订阅活动?

(在subviewController我同意引用的MainViewController一个事件,当打开子视图两次,我收到两个事件触发,因为在viewdidunload退订()永远不会被调用。)

如何与订阅/退订在ViewWillAppear/ViewWillDisapper中?

public override void ViewWillAppear (bool animated) 
    { 
     base.ViewWillAppear (animated); 

     this.mBL.OrderChanged += HandleOrderChanged;    
    } 

    public override void ViewWillDisappear (bool animated) 
    { 
     base.VieWillDisappear (animated); 
     if (this.mBL!=null) 
      this.mBL.OrderChanged -= HandleOrderChanged;   
    } 

回答

1

使用ViewDidLoadViewDidUnload,这些都是合适的地方,以认购从UI /退订事件。

这里是iOS中的内存管理,我觉得一般的文章在这里适用:http://www.buildingiphoneapps.com/buildingiphoneapps/2010/6/25/memory-management-and-viewdidunload.html

现在,如果你不想让事件运行当你的视图是不可见的,在做这样的事情事件处理程序:

if (IsViewLoaded && View.Window != null) { 
    //code here 
} 

我发现这是判断视图是否在屏幕上的最简单方法。

+0

这有什么错用viewWillAppear中和ViewWillDisappear()?然后不需要检查。另一个关于你的检查的问题是:如果你在ViewDidUnload中调用“View.Window”,那么“View”调用不会再次加载视图吗? – Krumelur 2012-04-16 18:44:27

+0

我会使用ViewWillAppear和ViewWillDisappear,谢谢。 – BlueSky 2012-04-17 06:03:36

+0

请注意,在UINavigationController中,ViewWillAppear和ViewWillDisappear可能无法正常工作。 ViewWillAppear/Disappear不会在控制器被推上时调用。类似的情况发生在模态视图控制器。 – jonathanpeppers 2012-04-17 12:00:16