Случайное «Не удалось загрузить NIB в комплекте» в UITableView - PullRequest
2 голосов
/ 20 января 2012

У меня есть приложение 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 

У меня есть UIViewController с XIB-файлом, размечающим пользовательский интерфейс.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 Ответ

2 голосов
/ 20 января 2012

Это может быть следующая ошибка: вы пытаетесь установить свои вещи до того, как будет загружено представление для вашего сотового контроллера.Но я не очень уверен.: -)

Можно использовать два разных способа:

1) Синхронно загрузить XIB, как показано ниже

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

Для получения дополнительной информации см. Следующий учебник monotouch-custom-tables .

2) Следуйте следующему руководству по Создание-Custom-UITableViewCells-with-MonoTouch-the-right-way

ВПо моему мнению, вы можете попытаться следовать второму, если это не означает, что нужно много менять код.Мне нравится второй, потому что он отражает способ создания пользовательских ячеек в iOS.В разработке для iOS при создании пользовательских ячеек вы не создаете контроллер для ячеек.Ячейка - это только представление, в которое вы помещаете данные.Это как заполнитель, который динамически меняет свое содержимое.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...