Сбой TableView при попытке загрузки другим классом - PullRequest
1 голос
/ 27 марта 2012

У меня есть это приложение (стиль контактов), в котором вы можете добавлять экземпляры в табличное представление, и оно отлично работает для добавления объектов в список.Список представляет их в подробном виде отлично.Я могу вызывать представление «Добавить элемент» (UIViewController с табличным представлением в нем) столько раз, сколько мне нужно, в моем MasterViewController (UITableViewController, rootControler контроллера Nav).

Когда я увидел, что это работает,и хотел расширить функциональность моего приложения, чтобы позволить пользователю редактировать свои текущие объекты в списке, я добавил кнопку «Редактировать» в Nav Controller элемента detailView, этот UiBarButton вызывает метод, который пытается загрузить этот же «Добавить элемент»"представление, которое используется для добавления элемента в представление таблицы.Вот где начинают происходить странные вещи.

Если я запускаю приложение и нажимаю на существующий объект в представлении списка, я успешно перехожу в подробный вид.Если я затем коснусь кнопки «Редактировать», представление «Добавить элемент» прекрасно загружается с данными объекта, который он в данный момент редактирует.Затем я могу отменить / сохранить / отклонить это представление «Добавить элемент» много раз, пока я продолжаю вызывать его из подробного представления.Если я затем вернусь к представлению списка и попытаюсь добавить элемент, приложение вылетает.

Если я запускаю приложение и, прежде чем что-либо еще, я загружаю «Добавить элемент» из основного представления списка,представление будет отлично загружаться, и я могу идеально добавлять объекты столько раз, сколько захочу.Если затем перейти к подробному виду и попытаться редактировать объект, приложение вылетает.

Простое задание (если вам лень читать выше) : приложение вылетает всякий раз, когда япопробуйте загрузить представление «Добавить элемент» с контроллера, отличного от того, который загрузил его в первый раз.

Вот журнал сбоев:

    *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], 
    /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061
     2012-03-26 21:22:49.087 Vex Try 5[2749:f803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason:
    'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
    *** First throw call stack: ...

Видимо, второй разпытается загрузить, cellForRowAtIndexPath возвращает странную ячейку.

Вот как я называю это в виде списка:

- (void)insertNewObject:(id)sender
    {
        if (!_objects) {
             _objects = [[NSMutableArray alloc] init];
        }

        BIDVexTeam *newTeam = [[BIDVexTeam alloc] init];
        [_objects insertObject:newTeam atIndex:0];

        if (!self.addNew) {
            self.addNew = [[BIDEditViewController alloc] init];
        }

        if (!self.editNavController) {
            self.editNavController = [[UINavigationController alloc] initWithRootViewController:self.addNew];
        }

        addNew.title = @"Add New";
        addNew.team = newTeam;
        addNew.parent = self;

        [self presentModalViewController:self.editNavController animated:YES];

    }

А вот как я вызываю это из подробного вида:

    - (IBAction)editTeam:(id)sender {

        if (!self.editView) {
            self.editView = [[BIDEditViewController alloc] initWithNibName:@"BIDEditViewController" bundle:[NSBundle mainBundle]];
        }

        if (!self.editNavController) {
            self.editNavController = [[UINavigationController alloc] initWithRootViewController:self.editView];
        }

        editView.title = [NSString stringWithFormat:@"Edit %@", detailTeam.number];
        self.editView.team = self.detailTeam;

        [self presentModalViewController:editNavController animated:YES];
    }

Редактировать : Вот мой метод cellForRowAtIndexPath ... Не вставляйте его сюда, потому что он довольно длинный, а также снимок экрана с тем, чего я пытаюсь достичь:

http://www.clubpenguinaccess.com/extra/cellforrow-method.rtf

снимок экрана http://www.clubpenguinaccess.com/extra/app-screenshot.png

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

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

0 голосов
/ 27 марта 2012

Это, безусловно, указывает на возможность сбоя. Любая из строк, которые делают это:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

... может вернуть ноль, если ячейка для повторного использования уже не выделена. В некоторых случаях вы делаете распределение, как в этом случае:

} else if (indexPath.row == kImageRow) {

    static NSString *ImageCellIdentifier = @"ImageCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ImageCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageCellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

.. но не в нескольких других. Хорошая гипотеза для сбоя заключается в том, что он запускает путь, при котором ни одно из этих выделений ячеек не запускается.

Пожалуйста, найдите все вызовы в очереди, добавьте проверку на нулевое возвращение и выделите соответствующую ячейку. Я думаю, что ваш сбой будет исправлен.

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