我有一个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
我所拥有的是一个带有XIB文件的UIViewController,用于布局UI。 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)
{
}
我在这里做错了吗?对于这种情况可能很难做出重复。
答案 0 :(得分:2)
可能是以下错误:您尝试在加载单元控制器的视图之前设置您的内容。但我不太确定。 : - )
可以采用两种不同的方式:
1)同步加载xib,如下所示
MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("YourNibName", this, null);
有关详细信息,请参阅以下教程monotouch-custom-tables。
2)在Creating-Custom-UITableViewCells-with-MonoTouch-the-correct-way
上按照以下教程进行操作在我看来,你可以尝试按照第二个,如果这并不意味着改变很多代码。我喜欢第二个,因为它反映了你在iOS中创建自定义单元格的方式。在iOS开发中,当您创建自定义单元格时,不会为单元格创建控制器。单元格只是放置数据的视图。它就像一种占位符,可以动态地改变其内容。
希望它有所帮助。