2016-04-25 49 views
2

我有一個UITextView子類,我添加了一個NSNotificationCenter觀察者。但是我又在哪裏刪除觀察者?何時何地致電RemoveObserver

我的代碼:

_textDidChangeNotification = UITextView.Notifications.ObserveTextDidChange(TextDidChange); 

在Objective CI會做的dealloc方法,但我不知道在哪裏做同樣的在C#

據我瞭解的文件我應該叫

_textDidChangeNotification.Dispose() 

我試圖有一個

protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     if (disposing) 
     { 
      _textDidChangeNotification.Dispose(); 
     } 
    } 

但它永遠不會被調用。

完整的類,如要求:

public class PlaceholderTextView : UITextView 
{ 
    public string Placeholder 
    { 
     get { return PlaceholderLabel.Text; } 
     set 
     { 
      PlaceholderLabel.Text = value; 
      PlaceholderLabel.SizeToFit(); 
     } 
    } 

    protected UILabel PlaceholderLabel { get; set; } 

    protected NSObject _textDidChangeNotification; 

    public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set 
     { 
      base.Text = value; 
      AdjustPlaceholderHidden(); 
     } 
    } 

    public PlaceholderTextView() 
    { 
     SetupLayout(); 

     _textDidChangeNotification 
     = UITextView.Notifications.ObserveTextDidChange(TextDidChange); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     _textDidChangeNotification.Dispose(); 
    } 

    protected void SetupLayout() 
    { 
     PlaceholderLabel = new UILabel(new CGRect(0, 9, 0, 0)); 
     PlaceholderLabel.TextColor = UIColor.FromWhiteAlpha(0.702f, 1f); 

     AddSubview(PlaceholderLabel); 
    } 

    protected void AdjustPlaceholderHidden() 
    { 
     if (Text.Length > 0) 
     { 
      PlaceholderLabel.Hidden = true; 
     } 
     else 
     { 
      PlaceholderLabel.Hidden = false; 
     } 
    } 

    protected void TextDidChange(object sender, Foundation.NSNotificationEventArgs args) 
    { 
     AdjustPlaceholderHidden(); 
    }  
} 

回答

0

我會做的ViewWillDisappear像這樣:

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

     SubscribeMessages(); 
    } 

    public override void ViewWillDisappear(bool animated) 
    { 
     base.ViewWillDisappear(animated); 
     UnSubscribeMessages(); 
    } 

    public void SubscribeMessages() 
    { 
     _hideObserver = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification, OnKeyboardNotification); 
     _showObserver = NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification, OnKeyboardNotification); 
    } 

    public void UnSubscribeMessages() 
    { 
     if (_hideObserver != null) NSNotificationCenter.DefaultCenter.RemoveObserver (_hideObserver); 
     if (_showObserver != null) NSNotificationCenter.DefaultCenter.RemoveObserver(_showObserver); 
    } 

ViewDidDisappear像Xamarin示例代碼here

更新 我明白你的意思了,我是ld懷疑有些東西阻止了自定義視圖被垃圾收集。你看看這個blog post它可能有幫助。

也可以從這個sample code它看起來像您正確調用處置,但他們空出來ViewDidUnloadhere自定義視圖:

+0

有問題的類的UIView(的UITextView)的子類,所以沒有ViewWillDisappear或ViewDidDisappear或相似。 –

+0

你將UITextView添加到什麼?你可以在你添加視圖的任何地方調用UITextView的配置嗎? –

+0

當然,我可以從頂部的UIViewController手動完成所有操作。但是,這不會是一個正常的UIView。如果是Objective C,我可以在dealloc方法中執行它 –

-1

可以在DEINIT方法做到這一點。如果你沒有它,你必須實現它,如:

deinit { 
     // there you can remove observer 
} 
+0

您指的是Swift。這是C#和Xamarin,並且deinit析構函數方式不會轉換爲C#和.NET,因爲使用了垃圾回收器。 –