Как добавить представление uiviewcontroller как представление контента в uitableviewcell? - PullRequest
9 голосов
/ 08 апреля 2011

Я хочу добавить представление uiviewcontroller с кнопкой и несколькими метками в качестве представления содержимого uitableviewcell.

Хотя я могу добавить, но действие кнопки вызывает сбой.

MyViewController *controller = [[MyViewController alloc] initwithnibname:@"MyView" bundle:nil];
[cell.contentview addsubview:controller.view];
[controller release]; // if i comment out this part the button action is received by my view controller.

Однако при удалении из вида возникают утечки памяти. Сделка myviewcontroller не вызывается.

Как правильно это сделать?

  1. Добавить представление в ячейку uitableview который имеет кнопку и обрабатывается Контроллер просмотра

  2. Как обеспечить освобождение памяти когда вид выходит из области видимости?

ТИА, Правин

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

«Действие кнопки вызывает сбой» - Что такое сбой при нажатии кнопки?

Кроме того, вы, похоже, используете только представление MyViewController (поскольку вы добавляете представление в ячейку, а затемосвободить контроллер) - что этот контроллер должен делать, кроме как содержать представление?Почему бы просто не использовать представление?

Также (дикая догадка здесь) обычный конструктор кнопки не имеет нового / alloc / copy и, следовательно, не гарантирует освобождение.Я видел много сбоев кода из-за ненадлежащего выпуска UIButton.

1 голос
/ 23 апреля 2014

Добавление вида контроллера как subview к любому другому виду не сохраняет контроллер.Контроллер освобождается сразу после вызова разъединения, и любые действия кнопки будут отправлены на освобожденный экземпляр.

Этого можно избежать, поддерживая строгое указание на контроллер

@Property(nonatomic,strong)MyViewController *controller;

или добавляяконтроллер представления как ChildViewController

[self addChildViewController:controller];
1 голос
/ 08 апреля 2011

Я думаю, что проблема в том, что вы выпускаете контроллер и просто используете подпредставление, которое сохраняется в его суперпредставлении.Шаблон действия нуждается в цели, которая, как я полагаю, является освобожденным контроллером.И зачем вам выпускать свой viewController, если вам нужен только его вид?Сохраните его и сохраните ссылку через свойство к нему.

Мой способ добавления подпредставлений в ячейку табличного представления будет в подклассе UITableViewCell.Предположим, у вас есть подкласс UITableViewCell, скажем ButtonTableViewCell.Инициирование ячейки создает и добавляет UIButton в вашу ячейку и красиво помещает ее в contentView.Decalre свойство, которое ссылается на кнопку.Как UIButton *myButton.Что нужно сделать в cellForRowAtIndexPath, примерно так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ButtonTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyButtonCell"];           
    if (cell == nil) {
        cell = [[ButtonTableViewCell alloc] initWithReuseIdentifier:@"MyButtonCell"];
    }
    [cell.myButton addTarget:self action:@selector(onDoSomething) forControlEvents:UIControlEventTouchUpInside];

    // Do more cell configuration...
    return cell;
}

Я создал инициализатор initWithReuseIdentifier, который может быть легко реализован.

Вы гарантируете освобождение памяти с помощью viewDidUnload метод UIViewController и метод dealloc.

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