IOS: как удалить лишние ячейки по умолчанию, не имея ячейки в раскадровке
У меня есть несколько таблиц по умолчанию, например, те, у кого есть заголовок, или значок слева и заголовок справа.
Я не хочу добавлять эти ячейки в раскадровку и назначать им идентификатор, возможно ли это сделать?
он должен быть повторно использован, я знаю, как назначить новые ячейки, не подлежащие повторному использованию
Я попробовал ответы ниже,
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];
должен быть правильным, но это очень утомительно и легко забыть
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Выше, может быть, лучше, поскольку он помещает все коды в одном месте, но когда я пытаюсь выполнить dequeueReusableCellWithIdentifier: forIndexPath: (с помощью indexPath) он сработает.
- почему dequeueReusableCellWithIdentifier: forIndexPath вылетает, а dequeueReusableCellWithIdentifier не работает?
- Если я не передаю indexPath, ячейка повторно используется
- если он многоразовый, то зачем использовать dequeueReusableCellWithIdentifier: forIndexPath?
Ответы
Ответ 1
Если у вас нет прототипа в вашем раскадровке, вы можете использовать dequeueReusableCellWithIdentifier: api для создания классической ячейки
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Ответ 2
Вы можете отключить UITableViewCell, не имея ячейки прототипа в своем раскадровке. Вам необходимо зарегистрировать ячейку со своей таблицей для определенного идентификатора (строки). Вы сделали бы это так:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];
Вы могли бы сделать это в viewDidLoad
, может быть.
Затем вы можете деактивировать ячейку, используя этот идентификатор в вашем методе cellForRowAtIndexPath
, как обычно.
Edit:
Где MyCellIdentifier
- константа, которую вы определили где-то, конечно.
Ответ 3
Вам нужно попытаться деактивировать ячейку, и если вы получите nil
, чем создать ее. В файле xib ячейки укажите его идентификатор.
Задайте идентификатор ячейки в файле nib:
![Set cell identifier]()
Получить многоразовую ячейку или создать новую:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"myCell";
MyCell *cell = (MyCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
NSArray *t = [[NSBundle mainBundle] loadNibNamed:@"myCellXibFileName" owner:nil options:nil];
for (id currentObject in t)
{
if ([currentObject isKindOfClass:[MyCell class]])
{
cell = (MyCell *)currentObject;
break;
}
}
}
// Do whatever you want with the cell....
return cell;
}
Ответ 4
Swift 3.0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell = {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
return UITableViewCell(style: .default, reuseIdentifier: "cell")
}
return cell
}()
cell.textLabel?.text = anyArray[indexPath.row]
return cell
}
Это хорошо, потому что откройте ячейку.