2013-09-23 3 views
10

У меня есть UIView, который содержит UITableView. делегируют Tableview установлен в моей UIView, но он никогда не называет методы делегата:UITableView делегат и методы dataSource не получаются вызываемые

-(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

Что вы возвращаете из m 'numberOfRowsInSection:'? – Lance

+0

Кроме того, если это в UIView, как вы сказали, вы должны поместить код, который находится в 'init',' awakeFromNib' – Lance

+0

@Lance У меня также есть NSLog - он не вызван. Я редактировал мой пост выше. – Andrew

ответ

3

Вы должны объявить Ваш взгляд, как этот @interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

BTW: Я бы ViewController, что «контроль» Ваше мнение и ваш Tableview, и имеют ViewController быть делегат и источник данных в виде таблицы.

+1

Я не думаю, что декларация * .h является проблемой. Однако я полностью согласен с наличием контроллера вида, который контролирует представление и представление таблицы. Для этого они и есть. +1 – LuisCien

+0

Ах да, это имеет смысл. Я уверен, что табличное представление вызывает 'СоответствиеТопротоколу:' на делетете/dataSource – Lance

+0

@LuisCien Вы правы. .h не проблема. Я только что проверил это в одном из моих проектов. Я удалил эти протоколы и методы вызвали. – gWiz

0

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

[[UITableView alloc] initWithFrame:style:] создать таблицу View.

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

3

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

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

16

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

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

Я сделал что-то вроде этого один раз. Я объявил метод в UIView, как это:

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

И тогда я назвал setUpTableView от контроллера зрения я добавил этот вид на, как это:

[self.yourView setUpTableView]; 

Это может помочь. Благодарю.

+0

У меня была такая же проблема, используя мой собственный контроллер вида. Забыл dataSource = self. –

11

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

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

Я столкнулся с той же проблемой, как только то, что нелепая ошибка я был внутри initWithCoder я назвал [super init].TableView был в XIb

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

Вместо

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

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

0

попробовать это:

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

я имел эту дурацкую проблему слишком

Смежные вопросы