2016-03-31 3 views
0

Я не могу понять, как получить это UITableView для отображения.Как я могу отобразить этот UITableView?

Код создает таблицу полностью программно, за исключением наконечника.

Nib - это простая ячейка, которая работает в другом UITableView s в том же приложении.

Когда представление таблицы создается и добавляется как подвид к view и reloadData называют то numberOfSectionsInTableView: и tableView:numberOfRowsInSection: оба называются. Они оба возвращают 1. (Я проверил в отладчике.)

Однако tableView:cellForRowAtIndexPath: никогда не вызывается.

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

Отладчик иерархии представления не показывает ничего в этом месте и что на столе нет представления.

Приложение работает без ошибок и сбоев.

Примите во внимание вашу помощь.

@interface MyViewCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UIButton *button; 
@end 

@implementation MyViewCell 
@end 

@interface MyDataTableEntry : NSObject 
@property (nonatomic, strong) NSString* title; 
@end 

@implementation MyDataTableEntry 
@end 

@interface MyDataTable : NSObject <UITableViewDataSource, UITableViewDelegate> 
@property (strong, nonatomic) UITableView *tableView; 
@property (strong, nonatomic) NSArray *rows; 
@property (strong, nonatomic) UINib* nib; 
@end 

@implementation MyDataTable 

- (UINib*)getAndRegisterNib:(NSString*)reuseIdentifier { 
    UINib* nib = [UINib nibWithNibName:reuseIdentifier bundle:nil]; 
    [self.tableView registerNib:nib forCellReuseIdentifier:reuseIdentifier]; 
    return nib; 
} 

- (id)initWithRows:(NSArray*) rows andView:(UIView*)view { 
    if (self = [super init]) { 
     self.rows = rows; 
     self.tableView = [[UITableView alloc] initWithFrame:view.bounds style:UITableViewStylePlain]; 
     self.nib = [self getAndRegisterNib:@"PrototypeCell"]; 
     self.tableView.delegate = self; 
     self.tableView.dataSource = self; 
     self.tableView.backgroundColor = [UIColor grayColor]; 
    } 

    return self; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.rows.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PrototypeCell" forIndexPath:indexPath]; 

    MyDataTableEntry* entry = self.rows[indexPath.row]; 

    [cell.button setTitle:entry.name forState:UIControlStateNormal]; 
    cell.button.backgroundColor = [UIColor blueColor]; 

    return cell; 
} 

@end 

Вот отрывок, который создает таблицу:

MyDataTableEntry* entry = [[MyDataTableEntry alloc] init]; 
entry.title = @"hello"; 
self.dataTable = [[MyDataTable alloc] initWithRows:@[entry] andView:self.view]; 
[self.view addSubview:self.dataTable.tableView]; 
[self.dataTable.tableView setNeedsLayout]; 
[self.dataTable.tableView layoutIfNeeded]; 
[self.dataTable.tableView reloadData]; 
+0

Где вы добавляете табличное представление в супервизор? Пожалуйста, покажите, что код – Paulw11

+0

@john Кешью, пожалуйста, назначьте строки массива = [NSArray arrayWithObjects: @ "A", @ "B", @ "C", @ "D", @ "E", nil]; . после получения таблицы. – iOS

+0

@ DarjiJigar вы могли заставить его работать? –

ответ

3

Без подтверждения в отладчике:

Проблема здесь:

self.dataTable = [[MyDataTable alloc] initWithRows:@[entry] andView:self.view]; 
[self.view addSubview:self.dataTable]; 

self.dataTable является NSObject. Вторая строка должна прочитать примерно следующее:

[self.view addSubview:self.dataTable.tableView]; 

Я также предлагаю вам провести рефакторинг. MyDataTable - не вид. Это контроллер. Поэтому переименуйте в MyDataTableController. Тогда ошибка была бы более очевидной.

Я также спросил бы, почему вы делаете это в коде? вы уже используете наконечники. Так почему бы не пойти на раскадровки. Выполнение этого и использование UITableViewController в качестве базового класса должно позволить вам удалить много кода и потенциальных ошибок.

+0

Приносим извинения. Когда я поспешно сделал этот пример кода, я ввел ошибку. Код в приложении добавляет 'self.dataTable.tableView' как subview. Это код, поэтому его можно повторно использовать в нескольких раскадках. Должен ли я переключиться на использование UITableViewController, даже если я придерживаюсь кода для этого? –

+0

@JohnCashew Я всегда использую 'UITableViewController', если нет проблемы с дизайном, которая останавливает меня. Например, когда представление таблицы является лишь частью отображения, которое управляет контроллер. Другой потенциальной ошибкой может быть то, что при создании табличного представления, основанного на границах представления, границы фактически равны нулю. Поэтому таблица равна нулю. Точка останова и проверить это. – drekka

+0

Да, вы абсолютно правы. Проблема в том, что frame is is size 0. –

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