2014-01-29 3 views
9

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

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; 
} 

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

+2

Что такое рама для просмотра таблицы? – Wain

+1

Предыдущий ответ решает, но настоящее объяснение здесь: [http: // stackoverflow.ком/вопросы/7712325/cellforrowatindexpath-не называемые] [1] [1]: http://stackoverflow.com/questions/7712325/cellforrowatindexpath-not-called – GrandSteph

+0

Правильный ответ здесь HTTPS://stackoverflow.com/questions/7712325/cellforrowatindexpath-not-called – Ramis

ответ

25

Вы должны установить рамку из UITableView

+25

Вы должны расширить свой ответ - однострочные ответы не очень полезны. –

+0

Я использую UITableViewController. Имеет ту же проблему. Каково решение для моего? –

1

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

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

В вашем случае, вы должны инициализировать Ваш TableView с рамкой (например, предложенный в коде выше). Просто убедитесь, что вы добавляете код в 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

В XCode6 же странно проблема происходит со мной, когда «Добавить Отсутствующие Constraints» наносится на Tableview на раскадровку для настройки представления.

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

enter image description here

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

enter image description here

+0

Спасибо, очень много! – fancy

9

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

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

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

я делал

MyDataSourceClass* myClass = [[MyDataSourceClass alloc] initWithNSArray:someArray]; 
tableView.dataSource = myClass; 
tableView.delegate = myClass; 
[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. 

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

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