Передан параметр UIButton nil в целевой метод - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь правильно установить цель для события касания UIButton в подклассе UITableCell (разработан в IB), который удалит эту ячейку.Однако при запуске в симуляторе я получаю следующую ошибку:

* Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «* - [__NSPlaceholderArray initWithObjects: count»:]: попытка вставить объект nil из объектов [0] '

Это нормально подходит для метода, но всегда вылетает сразу после строки NSArray arrayWithObject.Кажется, причина этого в том, что кнопка, переданная методу target, всегда равна nil.

Я предполагаю, что это проблема с памятью, но я совершенно сбит с толку относительно того, как ее исправить.Мне просто нужно создать ячейку полностью программно, чтобы заставить это работать, или есть простой способ как-то указать цель действия кнопок в качестве основного ViewController из Interface Builder?

Здесь находятся ячейкисозданный в контроллере представления:

-(UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


    if(tableView==songList){


        static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

        SongCell *cell = (SongCell *)[tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

        if(cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SongCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
            [cell.addButton addTarget:self action:@selector(addToPlaylist:) forControlEvents:UIControlEventTouchUpInside];


        }

        NSUInteger row = [indexPath row];
        cell.songname.text = @"test";//[songListData objectAtIndex:row];

        return cell;
    }

    return nil;

}

И вот целевой метод:

-(void)addToPlaylist:(id)button{

    SongCell *song = (SongCell *)[(UIButton *)button superview];
    NSIndexPath *indexPath = [self.songList indexPathForCell:song];
    NSArray *rowToMove = [NSArray arrayWithObject:indexPath];

    [self.songList beginUpdates];
    [self.songList deleteRowsAtIndexPaths:rowToMove withRowAnimation:UITableViewRowAnimationFade];
    [self.songList endUpdates];

}

Любая помощь, которую вы можете предложить, будет принята с благодарностью.

1 Ответ

0 голосов
/ 22 ноября 2011

Ошибка b / c indexPath должна быть равна нулю.В вашем примере кода есть несколько подозрительных вещей.Какова ваша реализация SongCell?Когда вы добавляете подпредставления в ячейку, вы должны добавить их в ячейку contentView против ячейки.Также похоже, что [button superview] не возвращает ячейку, и поэтому следующая строка возвращает nil для indexPath.

Несколько других мыслей:

  1. Похоже, вам нужен только номер строки при нажатии кнопки.Вы можете сохранить rowIndex + 1 в свойстве тега кнопки, а затем получить его - 1 в addToPlaylist:.Вам нужно +/- b / c свойство тега должно быть> 0. В качестве альтернативы используйте подкласс UIButton, у которого есть свойство для хранения ваших indexPath.

  2. Если вы собираетесьчтобы удалить строку с помощью deleteRowsAtIndexPaths:withRowAnimation:, сначала необходимо удалить эту же строку из источника данных, чтобы сохранить целостность таблицы.

  3. Если вы делаете только одно удаление, выне нужно beginUpdates / endUpdates.

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