在UITableView中随机“无法在bundle中加载NIB”

时间:2012-01-20 15:07:56

标签: 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 

我所拥有的是一个带有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)
{
}

我在这里做错了吗?对于这种情况可能很难做出重复。

1 个答案:

答案 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开发中,当您创建自定义单元格时,不会为单元格创建控制器。单元格只是放置数据的视图。它就像一种占位符,可以动态地改变其内容。

希望它有所帮助。