デバイスにランダムに例外をスローするように見える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開発では、カスタムセルを作成するときに、セルのコントローラーを作成しません。セルは、データを配置するビューにすぎません。コンテンツを動的に変更する一種のプレースホルダーのようなものです。
それが役に立てば幸い。