UITableView cellforrowatindexpath не вызывается - PullRequest
7 голосов
/ 21 декабря 2009

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

В моем приложении у меня есть несколько представлений (т.е. .xib-файлов). При нажатии кнопки в главном представлении (CouponWebsiteViewController.Xib) приложение должно загрузить второе представление (BrowseList.Xib), которое содержит UITable, и мне нужно заполнить этот UITable некоторыми данными. Я написал следующий код для заполнения данных в файле BrowseList.m:

- (void) viewDidLoad{
    arrayData = [[NSArray alloc] init];
    arrayData = [arrayData arrayByAddingObject:@"dfsgdf"];
    arrayData = [arrayData arrayByAddingObject:@"aaaaaa"];
    self.lblNewScreen.text = [arrayData objectAtIndex:0];
    [super viewDidLoad];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [arrayData count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                 initWithStyle:UITableViewCellStyleDefault 
                 reuseIdentifier:CellIdentifier] 
                autorelease];
    }

    NSString *cellValue = [arrayData objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;
    [tableView setEditing:YES animated:YES];
    return cell;
}

Но это не заполнение данных в таблице, когда я отлаживал этот код, я обнаружил, что он не выполняет метод cellForRowAtIndexPath, а отлаживает методы numberOfRowsInSection и numberOfSectionsInTableView.

Но интересно то, что когда я пишу тот же код на CouponWebsiteViewController.m (т.е. в главном представлении), тогда он заполняет данные в таблице.

Суть в том, что этот код работает нормально на главном экране, но не работает для других видов.

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

Спасибо заранее. Гаурав

Ответы [ 12 ]

9 голосов
/ 19 января 2010

Я не уверен, но вот некоторые идеи.

  • Я думаю, что когда вы поместите этот код массива в viewDidLoad, будет слишком поздно. ViewDidLoad выполняется после того, как данные уже помещены в таблицу. Попробуйте поместить этот код в метод initWithStyle или в любой другой метод init. Или вы могли бы даже поместить его в метод ViewWillAppear, но затем обязательно следуйте этому следующему предложению.
  • Другая вещь, которую вы можете попробовать, это просто вызвать [self.tableView reloadData] в конце метода viewDidLoad. Хотя это не так идеально, как первое предложение.
5 голосов
/ 28 марта 2012

Вы уверены, что установили свой класс в качестве источника данных в таблице? Чтобы сделать это, удерживая нажатой клавишу «Control» + щелкните представление таблицы в Интерфейсном Разработчике и перетащите его на Владелец файла в разделе «Заполнители». Затем выберите источник данных (и, возможно, тоже делегируйте, в зависимости от настроек вашего контроллера).

4 голосов
/ 29 января 2014

Для всех, кто сталкивался с этой проблемой, я решил эту проблему, добавив контроллер TableView в качестве дочернего к родительскому контроллеру, используя:

UITableViewController * table = [[UITableViewController alloc] init];
...
[self.view addSubview:table.tableView];
[self addChildViewController:table];
4 голосов
/ 11 октября 2013

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

Действительно, это может быть причиной того, почему метод cellForRowAtIndexPath не вызывается, однако следует вызывать numberOfRowsInSection.

В этом случае вы ничего не увидите в своей таблице.

3 голосов
/ 19 января 2014

Старый вопрос, но я буду вмешиваться. Для других.

Существует несколько причин, по которым табличное представление не обновляется, и что cellForRowAtIndexPath: не вызывается.

Если вы используете UITableViewController напрямую, возможно, что метод "numberOfRowsInSection:" возвращает 0

Если вы используете UItableView в вашем контроллере представления. Скорее всего, вы не приняли правильные протоколы и не внедрили правильные методы - плюс, если вы используете XIB или раскадровку, которой вы не назначили правильного делегата, и источником данных является другая потенциальная проблема.

Наконец, если вы используете подкласс UITableViewController, возможно, вы не перезаписали ни один из методов по умолчанию и снова numberOfRowsInSection возвращает 0.

3 голосов
/ 29 марта 2011

Инициализация UITableView в viewWillAppear ...

1 голос
/ 19 сентября 2012

Я столкнулся с некоторой подобной проблемой там.Делегат табличного представления и источник данных установлены правильно, и (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section также возвращает положительное число.Но - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath никогда не вызывается.

Я пробовал методы раньше, но он тоже не работает.Наконец, я заметил, что забыл добавить табличное представление как подпредставление моего контроллера представления.После этого он работает как шарм.

0 голосов
/ 09 декабря 2015

Убедитесь, что просмотр таблицы добавлен в представление. Если нет, то будут вызваны другие методы делегата табличного представления и источника данных, но не cellforrow:)

0 голосов
/ 05 мая 2015

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

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

не возвращает 0. Если эта функция не реализована или если она возвращает 0, метод:

cellForRowAtIndexPath:(NSIndexPath *)indexPath 

вообще не вызывается, так как нет отображаемых ячеек.

0 голосов
/ 11 февраля 2015

У меня также была такая проблема в UITableView, я также установил источник данных и делегировал представление таблицы, но мой метод cellForRowAtIndexPath не был вызван.

Решение:

  • моя сеть заблокировала мой метод (с помощью брандмауэра). Я спросил моего сетевого администратора, и мне дали полный доступ к сети, а затем был вызван мой метод cellForRowIndexPath.

  • когда мой ответ поступил от веб-службы, из-за того, что ответ сетевого блока был черным, метод cellForRowIndexPath не был вызван.

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