Недопустимые вызовы делегатов 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
- Сначала я подумал, что это проблема
UITableViewDelegate
(как предлагали другие ответы). Не было Я связал его с моим контроллером представления в моей раскадровке.
- Затем я подумал, что это проблема
UITableViewDataSource
, поскольку я не реализовал метод протокола numberOfSections(in tableView:)
(как предлагали другие ответы). Не было Согласно документации UIKit,
// по умолчанию 1, если не реализовано
- Наконец, я проверил настройки моего вида таблицы:]