Не вызван didSelectRowAtIndexPath. Подкласс UITableViewController

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

Пробовал программировать больше в стиле OO.

ПРИМЕЧАНИЕ:

Кажется, проблема связана с наличием UITableView (который является типом scrollview) поверх другого UIScrollView. Пытаюсь получить разъяснения о том, как заставить это работать.

Итак, я создал подкласс UITableViewController и добавил его в качестве объекта в свой класс Mainview.

 @interface NRTableVC : UITableViewController <UITableViewDelegate, UITableViewDataSource>
{
      NSArray * tableLabelsArray;
}
@end
  

Таблица прокручивается и отображается нормально.

Но мой

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Did select row");
}
  

метод никогда не вызывается.

в моем классе Mainview я использую его следующим образом

     RTable = [[[NRTableVC alloc] initWithStyle:UITableViewStylePlain]autorelease];
[scrollview addSubview:RTable.view];
  

Мне было интересно, поэтому мне нужно как-то установить self в качестве делегата или что-то в этом роде.

Кто-нибудь может дать мне несколько советов относительно того, что не так?

Большое спасибо, код

Комментарии:

1. Правильно ли заполняется таблица данными?

2. Да, таблица заполняется правильно. Единственное, что не работает, это то, что таблица не реагирует на касания. Когда нажимается ячейка. Ячейка выделяется, но не вызывается метод ‘didSelectRowAtIndexPath’.

3. Не могли бы вы записать следующее: RTable.view.DataSource и . делегировать? Равен ли результат журнала вашему ViewController или равен RTable?

4. Вы видите таблицы с пустыми ячейками?

Ответ №1:

Вы установили делегат для tableview? Без набора делегатов он не будет вызывать никаких методов делегирования.

Комментарии:

1. Да, у меня есть с self.TableView.delegate = self;

2. Чего вам, вероятно, не хватает, так это RTable.view.delegate = self

3. Я не могу этого сделать. Но я не могу сделать RTable.TableView.delegate = self; Что приведет к сбою приложения. Я предполагаю, что размещение UITableView внутри ScrollableView не должно происходить. Я вернусь к тому, как я делал раньше.

Ответ №2:

Что я обычно делаю, так это то, что в представлении, которое я хочу видеть в таблице, создается экземпляр

Я делаю это в методах viewDidLoad или loadView

 UITableView *tableView = [UITableView alloc] init...
tableView.delegate = self;
tableView.datasource = self;
  

Затем я добавляю его в качестве подвида текущего представления.

Это означает, что ваш MainView должен реализовать методы источника данных и делегирования TableView.

Редактировать:

Если вы используете interface builder, не забудьте перетащить источник данных и делегировать его владельцу файла

Комментарии:

1. Именно так я всегда добавлял таблицы в свои представления. Но, как я уже сказал выше, я подкласс, чтобы попытаться изучить другой способ. По-видимому, таблицы не выбираются при просмотре прокрутки.

2. Это имеет смысл, но вместо того, чтобы иметь 2 таблицы (см. Комментарий ниже), просто используйте разделы для 1 tableview?

Ответ №3:

Что-нибудь сохраняется RTable ? Вы автоматически удаляете его, но не показываете никакого кода, который указывает, что он где-либо сохраняется.

Комментарии:

1. Хорошо, точка. Также: не рекомендуется просто добавлять представление ViewController в представление другого VC, поскольку это означает, что несколько основных методов UIViewController не вызываются, в том числе: viewDidLoad, undoad, didAppear …

2. Он добавлен в представление. So сохраняется этим, пока представление живо.

3. addSubview увеличивает количество сохранений

4. @FelixLam, значит, вы считаете (знаете), что лучше просто добавлять UITableViews непосредственно в представление, а не подклассифицировать их?

5. также: добавление представления в другое представление увеличивает количество сохранений представления, а не его контроллера. Следовательно, VC будет выпущен, как только ваш пул авторелиза будет исчерпан. В какой-то момент вы должны увидеть сбой.