CellForRowAtIndexPath не вызывается, а numberOfRowsInSection называется

У меня простая проблема, но я не понимаю, что это такое. У меня есть UIViewControler (называемый RootController), который загружает UIView (называемый SecondView), который содержит tableView. Проблема в том, что UIView вызывает numberOfSectionsInTableView и numberOfRowsInSection, но не вызывает cellForRowAtIndexPath, и представление таблицы не отображается. Код RootViewController:

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60, self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

И код SecondView:

@interface SecondView () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic,retain) UITableView *table;
@end

@implementation SecondView
@synthesize table;

- (id)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self) {
   self.table = [[UITableView alloc] init];
   self.table.delegate = self;
   self.table.dataSource = self;
   [self addSubview:self.table];
   }
 return self;
}

- (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];
     }
  cell.textLabel.text = @"Prova";
  return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return 5;
}

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

Можете ли вы помочь мне найти проблему? Спасибо.

Ответ 1

Вам нужно установить Frame UITableView

Ответ 2

Это также может произойти, если reloadData вызывается в другом потоке. Убедитесь, что он запущен в основном потоке, так как все элементы пользовательского интерфейса должны произойти в основном потоке.

dispatch_async(dispatch_get_main_queue(),{
            self.myTableView.reloadData()
        });

Ответ 3

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

я делал

MyDataSourceClass* myClass = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = self.tableViewDataSource;
tableView.delegate = self.tableViewDataSource;
[tableView reloadData];

// end of function, myClass goes out of scope, and apparently tableView has a weak reference to it

Нужно делать

self.tableDataSource = [[MyDataSourceClass alloc] initWithNSArray:someArray];
tableView.dataSource = myClass;
tableView.delegate = myClass;
[tableView reloadData];
// now at the end of the function, tableDataSource is still alive, and the tableView will be able to query it.

Обратите внимание, что приведенный выше код является псевдокодом из памяти. Возьмите из этого понятие "убедитесь, что ваш источник данных/делегат живет долго", но не копируйте и не вставляйте его, потому что есть другие вещи, которые вам нужно сделать (например, установить фрейм и т.д.).

Ответ 4

В XCode6 такая же странная проблема возникла у меня, когда "Add Missing Constraints" применяется к tableView на Storyboard для настройки представлений.

Чтобы устранить эту проблему на первых четких ограничениях раскадровки:

enter image description here

затем примените ограничения следующим образом:

enter image description here

Ответ 5

Вы можете вызвать только представление viewcontroller ПОСЛЕ, вызывается viewDidLoad. Вы не можете взаимодействовать с self.view в методе init

- (void)viewDidLoad {
    [super viewDidLoad];
    self.table = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.table.delegate = self;
    self.table.dataSource = self;
    [self addSubview:self.table];
}

В вашем случае вам нужно создать таблицу с кадром (как показано в приведенном выше коде). Просто убедитесь, что вы добавили код в viewDidLoad в свой viewController

SecondView *secondView = [[seconddView alloc] initWithFrame:CGRectMake(0, 60,     self.view.bounds.size.width, self.view.bounds.size.height)];
[self.view addSubview:secondView];

Ответ 6

У меня такая же проблема, как у вас:

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

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

Ответ 7

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

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

Решение (для меня) было в раскадровке. Я не установил ограничения для Табличного Представления. Выберите табличное представление, щелкните значок "Добавить новые ограничения" (выглядит как квадратный боец TIE) и установите ограничения для вершины, низа, движения вперед и трейлинга. Затем будет вызван cellForRowAt, и ваша таблица будет заполнена.

Я надеюсь, что это помогает кому-то.

Ответ 8

Удалите UITableView и добавьте снова в свой ViewController