Недопустимые вызовы делегатов UITableView и dataSource

У меня есть UIView, который содержит UITableView. Делегат tableview установлен в мой UIView, но он никогда не вызывает методы делегата:

-(id)init {
    self = [super init];
    if (self) {
        self.tableView = [[UITableView alloc] initWithFrame:self.bounds];
        self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        self.tableView.scrollEnabled = NO;
        self.tableView.layer.cornerRadius = PanelCornerRadius;
        [self addSubview:self.tableView];
    }
    return self;
}

#pragma mark - UITableViewDelegate methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"height for row");
    int height = [self heightForRowAtIndexPath:indexPath];

    return height;
}

#pragma mark - UITableViewDataSource methods

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

    NSLog(@"number of rows");
    if (self.manager.fetchOperation.dataFetchProblem) {
        return 1;
    }

    int numberOfRows = [self.delegate numberOfSectionsInPanel:self];

    return numberOfRows;
}

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

EDIT: Включено числоOfRowsInSection. Он может потенциально возвращать 0, только он никогда не получает этого шанса, потому что "количество строк" ​​NSLog никогда не будет вызвано.

Ответ 1

Не могли бы вы написать код, который вы написали на вашем методе cellForRowAtIndexPath:? Потому что я не могу найти что-то не так с вашим кодом.

Вы вызываете свой UIView из какого-либо другого ViewController? Если да, то как?

Я однажды сделал что-то подобное. Я объявил метод в UIView следующим образом:

- (void)setUpTableView{
    self.tableview.delegate=self;
    self.tableview.dataSource=self;
}

И затем я вызвал setUpTableView с контроллера представления, я добавил этот вид, например:

[self.yourView setUpTableView]; 

Это может помочь. Спасибо.

Ответ 2

У меня была аналогичная проблема, мое решение состояло в том, что я не установил количество секций в 1.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

Ответ 3

Вы должны объявить свое мнение следующим образом @interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

BTW: у меня был бы ViewController, который "контролирует" ваш просмотр и ваш табличный вид, а ViewController будет делегатом и источником данных в виде таблицы.

Ответ 4

Вам не нужно использовать UIViewController, который представляет собой только дымовую завесу. Вам также не нужно добавлять в .h, хотя вы все равно должны это делать, потому что Xcode будет жаловаться иначе, и вы не получите автоматическое завершение имени метода.

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

Ответ 5

Я столкнулся с одним и тем же вопросом однажды, какую глупую ошибку я сделал внутри initWithCoder, я назвал [super init]. TableView был в xib

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super init]
}

Вместо

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
}

Просто убедитесь, что это не тот случай

Ответ 6

попробуйте следующее:

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

У меня тоже была эта глупая проблема

Ответ 7

Попробуйте изменить UIView на UIViewController и в viewDidLoad, вызовите

[[UITableView alloc] initWithFrame:style:], чтобы создать представление в таблице.

Установите себя как делегат и источник данных, как вы делали выше, а затем добавьте этот UITableView в качестве Subview в этом контроллере.

Ответ 8

Я случайно установил для своего свойства tableView allowsSelection значение false.

Решение раскадровки

Выберите вид таблицы и установите следующее... enter image description here

Быстрое решение

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.allowsSelection = true
}

Notes

  1. Сначала я подумал, что это проблема UITableViewDelegate (как предлагали другие ответы). Не было Я связал его с моим контроллером представления в моей раскадровке.
  2. Затем я подумал, что это проблема UITableViewDataSource, поскольку я не реализовал метод протокола numberOfSections(in tableView:) (как предлагали другие ответы). Не было Согласно документации UIKit,

// по умолчанию 1, если не реализовано

  1. Наконец, я проверил настройки моего вида таблицы:]