2012-03-28 17 views
2

私は、UITableViewControllerUITableViewSourceUITableViewDataSource !!!ではない)をサブクラス化することによってMonoTouchでテーブルビューを描画しています。私のビューコントローラのコンストラクタで、私はそのようなテーブルビューのソース設定:メモリ警告を受け取った後、UITableViewControllerが空白になる

TableView.Source = new CustomTableViewSource(); 

をそして、私のCustomTableViewSourceに、私は、テーブルビューのセルを構築しています。 iPhoneシミュレータでメモリ警告をシミュレートしている場合を除いて、素晴らしい作業です。ビューが非表示になっている場合(たとえば、タブバーの他のビューコントローラが選択されている場合)、戻ったときにテーブルビューは空白になります(白い背景、テーブルビューはもうありません)。

ただし、私はDidReceiveMemoryWarningコールバックで何もしていません。私もviewWillAppear(メモリ警告を受け取った場合)のTableViewSourceを再設定しようとしましたが、それ以上の成功はありません...

ガベージコレクタの問題ですか?私は、メモリ警告を受け取ったときにGC.Collectが呼び出されたことを知っています。多分ガベージコレクターが私の見解を捨てて、それをもう一度表示する必要がありますか?

+1

はあなた 'ViewDidLoad'と' ViewDidUnload'方法を投稿してください。 – jonathanpeppers

答えて

2

テーブルソースは、コンストラクタではなくViewDidLoadメソッドで初期化する必要があります。このメソッドは、ビューコントローラがロードされたときに呼び出され、メモリ警告後にコントローラのビューを再作成する必要があるたびに呼び出されます。

私はいくつかのテストを行いましたが、メモリ警告の後に同様の結果が得られます。しかし、私は空のテーブルビューを取得します。再度ViewWillAppearでテーブルソースを設定すると、テーブルにはデータが正常に取り込まれます。

ViewWillAppearでの実装が機能しないという事実は、このメソッドが呼び出されることさえないと思います。そのような場合は、テーブルビューが必要なときに再作成されていないと推測しています。

これは、XIBファイルからビューが作成されていないコントローラを使用している場合に発生することがあります。この場合、ビューをLoadViewメソッドで作成する必要があります(ベースを呼び出さずに)。loadViewメソッド()):

public override void LoadView() 
{ 
    this.View = new UITableView(UIScreen.MainScreen.ApplicationFrame); //or something similar 
} 

は、私が提供するときに問題が解決されたなどのView Controllerを含んナビゲーションコントローラを含まタブコントローラの複雑な階層と同様の問題(再作成されていないテーブルビュー)を有していましたLoadViewメソッド。

私は推測のうちのよ;)

+1

ありがとう!それは私の問題を修正しました!申し訳ありませんが、私はより多くの情報を提供したはずです。あなたが推測したように、私はXIBファイルを使用せず、コードでテーブルビューを作成しています。 'LoadView()'は実装されていませんでした。 – nicolas

+0

あなたは大歓迎です! –

1

メモリ警告を受け取ったときにGC.Collect()が呼び出されることは間違いありません。これはオペレーティングシステムからの重大な警告です。MonoTouchは、可能であれば、自身のメモリを解放しようとします。 DidReceiveMemoryWarningをオーバーライドすることでこれを拡張することができます。これにより、アプリケーションは、絶対に必要でないメモリも解放することができます。

このGC呼び出し(他のオブジェクトと同様)は、参照されていないすべてのオブジェクトを収集して解放できることを意味します。今度はCustomTableViewSourceインスタンスを収集しないでください(TableViewがない場合)。疑問がある場合は、タイプのファイナライザを追加することで確認できます。あなたのCustomTableViewSourceの一部であるオブジェクト(参照されていない場合)あなたのテーブルの他の部分(UI)として収集することができが、可能性が

~CustomTableViewSource() 
{ 
    Console.WriteLine ("~CustomTableViewSource"); 
} 

。ソースコードを見ることなく伝えることは不可能です。

私は、解放されているものを見つけようとすることをお勧めします。参照を保持する(収集を避けるために)必要があるか、再作成する必要があるかを確認する必要があります。

1

要約すると、働いている私の解決策は次のとおりです。

public class LoginViewController : UITableViewController 
{ 
    LoginDataSource m_loginDataSource; 

    public LoginViewController(UITableViewStyle withStyle) : base(withStyle) 
    { 
    m_loginDataSource = new LoginDataSource(this); 
    } 

    public override void LoadView() 
    { 
    this.View = new UITableView(UIScreen.MainScreen.ApplicationFrame, UITableViewStyle.Grouped); 
    } 

    public override void ViewDidLoad() 
    { 
    base.ViewDidLoad(); 
    TableView.Source = m_loginDataSource; 
    } 
} 
+0

それを得る必要はありません。 ViewDidLoadメソッドの中でTableView.Source = new LoginDataSource(this)を実行してください。 –

+0

右:-)更新:-) – nicolas

関連する問題