c# - UITableViewでランダムに「NIBをバンドルでロードできませんでした」

c# iphone ios uitableview xamarin.ios

デバイスにランダムに例外をスローするように見えるMonoTouchアプリケーションがあります。

Jan 19 11:54:31 unknown UIKitApplication:com.mycompany.myapp[0xbab7][552] 
<Notice>: MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown.  
Name: NSInternalInconsistencyException Reason: 
    Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/my-guid/MyApp.app> (loaded)' with name 'MyTableCellController' Jan 19 11:54:31 unknown UIKitApplication:com.mycompany.myapp[0xbab7][552] <Notice>:   
at MonoTouch.UIKit.UIViewController.get_View () [0x00000] in <filename unknown>:0  Jan 19 11:54:31 unknown UIKitApplication:com.mycompany.myapp[0xbab7][552] <Notice>:  
at MyDataSource.GetCell (MonoTouch.UIKit.UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) [0x00000] in <filename unknown>:0  Jan 19 11:54:31 unknown UIKitApplication:com.mycompany.myapp[0xbab7][552] <Notice>:   
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0  Jan 19 11:54:31 unknown UIKitApplication:com.mycompany.myapp[0xbab7][552] <Notice>:   
at MyApp.Application.Main (System.String[] args) [0x00000] in <filename unknown>:0 


私が持っているのは、UIをレイアウトするXIBファイルを持つUIViewControllerです。 XIBは、他のコントロールやアウトレットなどを備えたカスタムUITableViewCellをセットアップします。

次に、エラーをスローするGetCellメソッドの例を示します。

        public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
        {
            MyCellController controller = null;
            var cell = tableView.DequeueReusableCell (CellName);
            if (cell == null)
            {
                controller = new MyCellController();
                cell = (UITableViewCell)controller.View;
                cell.Tag = _count++;
                _controllers[cell.Tag] = controller;
            }
            else
            {
                controller = _controllers[cell.Tag];    
            }
            controller.LoadStuff(_myArrayOfStuff[indexPath.Row]);   
            return cell;
        }


エラーは行cell = (UITableViewCell)controller.Viewで発生し、エラーはXIBがまだロードされていないことに関係していると想定しています。

クラッシュはデバイスでランダムに発生し、すばやくスクロールしたときにのみ発生します。

XIBが非同期で読み込まれることがあると聞いたことがあります。UIViewControllerのコンストラクタは次のようになります。

public MyTableCellController () : base ("MyTableCellController", null)
{
}


ここで私が間違っていることはありますか?この場合の再現は難しいかもしれません。
答え
次のエラーの可能性があります:セルコントローラーのビューが読み込まれる前に、データを設定しようとしました。しかし、よくわかりません。 :-)

次の2つの方法があります。

1)以下のようにxibを同期的にロードします

MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("YourNibName", this, null);


詳細については、次のチュートリアルmonotouch-custom-tablesを参照してください。

2)Creating-Custom-UITableViewCells-with-MonoTouch-the-correct-wayの次のチュートリアルに従ってください

私の意見では、これが多くのコードを変更することを意味しない場合は、2番目の方法を試してみることができます。 2つ目は、iOSでカスタムセルを作成する方法を反映するため、気に入っています。 iOS開発では、カスタムセルを作成するときに、セルのコントローラーを作成しません。セルは、データを配置するビューにすぎません。コンテンツを動的に変更する一種のプレースホルダーのようなものです。

それが役に立てば幸い。
関連記事

c# - WPFウィンドウコンストラクターを使用してカルチャを変更できますか?

c# - C#ComboBox SelectedValueはフォーカスが失われるとリセットされます

c# - DebuggerDisplay属性を使用してビットマスクを表す方法

c# - C#およびMagentostoreを使用した製品のダウンロード

c# - MVC Mini Profiler-LINQオーバーヘッド

c# - C#MySqlConnector 6.4.4 LAST_INSERT_ID()As INT64?

c# - msiインストール後にexeを実行すると、起動チェックボックスが表示されますが、アプリが実行されません

c# - 0MQ Windows GUIのベストプラクティス

c# - Couchbaseのデフォルトのアイテムサイズを変更するにはどうすればよいですか?

c# - Nunit SetupUpFixture構文