Не удалось установить значения в пользовательской ячейке в UITableView из NSMutableArray
Помогите мне избавиться от этой дилеммы, которая возникла, когда я пытался освободить ячейку (Custom Cell). Ниже приведены некоторые шаги и отступы, которые я сделал с моим проектом.
Самое первое, я перетаскиваю UITableView в свой ViewController и добавляю ViewController.h, делая после этого
@interface ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>
Затем я создал Custom Cell с 3 UILabels и изменил высоту Cell на 65.
После этого я сделал свойство в ViewController.m
@property (nonatomic,strong) NSMutableArray *myTodoTitles;
Затем в методе (ViewDidLoad) я сделал.
myTodoTitles = [NSMutableArray arrayWithCapacity:10];
[myTodoTitles addObject:@"Go for ride"];
[myTodoTitles addObject:@"Do University Assignments"];
[myTodoTitles addObject:@"Watch Show"];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.myTodoTitles count]-1 inSection:1];
[self tableView:self.myTodoTable cellForRowAtIndexPath:indexPath];
После этого я просто сделал эти вещи в моем ViewController.m
#pragma mark - Table view data source
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *myIdentifier = @"TodoCell";
TodoCell *todoCell = (TodoCell*)[tableView dequeueReusableCellWithIdentifier:myIdentifier];
todoCell.todoTitleLabel.text = [self.myTodoTitles objectAtIndex:indexPath.row];
return todoCell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [myTodoTitles count];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
Но когда я запускаю проект, он ничего не выдал. Пожалуйста помоги
2 ответа
Скорее всего, вы не подключили свой viewController к источнику данных вашего tableView. Это можно сделать из Interface Builder или из кода. Вы можете легко проверить это, добавив self.myTodoTable.dataSource = self;
в самом начале viewDidLoad
метод.
А также: что вы имели в виду под `
[self tableView:self.myTodoTable cellForRowAtIndexPath:indexPath];`
в viewDidLoad
? Похоже, вы хотели сделать
[self.myTodoTable reloadData];
Есть UITableView методы с похожим именем:
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier
а также
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier
forIndexPath:(NSIndexPath *)indexPath
Первый попытается удалить из очереди многоразовую ячейку. Если он возвращает ноль, вы несете ответственность за создание соответствующей ячейки.
Последний всегда будет возвращать действительную ячейку: хотя вам придется заранее зарегистрировать определенный класс или NIB с этим табличным представлением. Документы
РЕДАКТИРОВАТЬ:
Как указывало ReDetection: первый метод также будет возвращать действительную ячейку, если вы зарегистрировали правильный класс (или nib) с этим табличным представлением.
В вашем случае это означает, что вы должны зарегистрироваться TodoCell
в viewDidLoad
с вашим tableView
,
Если TodoCell
сделано без.xib:
[self.tableView registerClass:[ToDoCell class]
forCellReuseIdentifier:@"TodoCell"];
Или если это сделано с.xib.
[self.tableView registerNib:[UINib nibWithNibName:@"TodoCell"
bundle:nil]
forCellReuseIdentifier:@"TodoCell"];
EDIT2:
В вашем коде также отсутствует настройка источника данных. Что-то вроде:
self.tableView.dataSource = self;
Это вызовет начальную перезагрузку.
Возможно, вы захотите установить делегата (так как ваш контроллер утверждает, что принимает этот протокол) таким же образом.