ios UITableView节标题在插入或删除行时消失

vcirk6k6  于 2023-01-14  发布在  iOS
关注(0)|答案(7)|浏览(126)

我有一个有4个部分的UITableView。其中三个部分有一个标题视图。
header视图是一个UITableViewCell,我将它作为viewForHeaderInSection:委托中的一个普通单元格从队列中取出。
如果在任何部分插入或删除一行,其他tableview标题单元格将消失。
我假设这与单元格重用有关,但是单元格最初都出现在屏幕上(所有三个标题同时出现在屏幕上)。
我试过在插入或删除后重新加载其他部分,但没有帮助。
下面是一些代码:

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    switch (section) {

        case kSectionCardInformation:
        case kSectionContactInformation:
        case kSectionTags: {

            static NSString *CellIdentifier = @"EditContactHeaderCell";
            EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
            return cell;
        }

        default:
            return nil;
    }
}

这里是我删除relevant部分中的行的地方:

- (void)deleteTag:(CDTag *)tag {

    [self.tableView beginUpdates];

    NSMutableArray *objects = [self.sections objectAtIndex:kSectionTags];
    if ([objects containsObject:tag]) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[objects indexOfObject:tag] inSection:kSectionTags];
        [objects removeObject:tag];

        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];

        [self.contact deleteTag:tag];
    }

    [self.tableView endUpdates];
}

任何帮助,非常感谢。

rjzwgtxy

rjzwgtxy1#

只需将UITableViewCell Package 到UIView中。

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

switch (section) {

    case kSectionCardInformation:
    case kSectionContactInformation:
    case kSectionTags: {

        static NSString *CellIdentifier = @"EditContactHeaderCell";
        EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UIView * view = [[[UIView alloc] init] autorelease];
        [view addSubview:cell];
        //setup the view's frame: fixed, autolayout, ...
        return view;
    }

    default:
        return nil;
}

}

zd287kbt

zd287kbt2#

添加评论,因为我有同样的问题...问题是,我也是使用一个UITableViewCell作为头部,而不是使用一个UITableViewHeaderFooterView。
要解决此问题:
1.创建一个nib文件,并在那里而不是在故事板的UITableView中制作自定义标题。
1.将其链接到自定义UITableViewHeaderFooterView类
1.在viewDidLoad函数中注册此笔尖

override func viewDidLoad() {
    self.tableView.rowHeight = UITableViewAutomaticDimension

    self.tableView.register(UINib(nibName: "NibFileName", bundle: nil), forHeaderFooterViewReuseIdentifier: "CustomViewHeaderView")
}

1.将可重用的HeaderFooterView从viewForHeaderInSection函数中出队:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier:"CustomViewHeaderView") as! CustomViewHeaderView

    return cell
}

这修复了我消失的标题。我希望它能帮助其他人。

1mrurvl1

1mrurvl13#

返回cellcontentView对我来说非常有效,不需要将单元格 Package 在UIView中。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")
    return cell.contentView
}
bvjveswy

bvjveswy4#

适用于Swift 4,5

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let containerView = UIView()
    guard let headerCell = tableView.dequeueReusableCell(withIdentifier: "MyHeaderView") as? MyHeaderView else { fatalError(" Failed to load MyHeaderView") }
    containerView.addSubview(headerCell)
    return containerView
}
lsmepo6l

lsmepo6l5#

不要返回FooterCell、HeaderCell或可重用标识符。返回reuseIdentifier. contentView。对我来说,它是:
返回标题单元格!.内容视图。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerCell = tableView.dequeueReusableHeaderFooterView(withIdentifier:"CustomViewHeaderView") as! CustomViewHeaderView

    return headerCell.contentView
}
mcvgt66p

mcvgt66p6#

解决此问题的正确方法是使用UITableViewHeaderFooterView而不是使用UITableViewCell作为标题部分。如@Francois Nadeau所回答。

有关如何将UITableViewHeaderFooterView用于标题部分的更多详细信息,请参见此答案:https://stackoverflow.com/a/36931047

deikduxw

deikduxw7#

我不知道你为什么用tableview单元格作为标题,但我的假设是

    • 您错过了break语句**
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    switch (section) {

        case kSectionCardInformation:
            break;
        case kSectionContactInformation:
            break;
        case kSectionTags: {

            static NSString *CellIdentifier = @"EditContactHeaderCell";
            EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            return cell;
        }

        default:
            return nil;
    }
}

在返回单元格之前检查nil条件,如果它为nil,则创建单元格。

static NSString *CellIdentifier = @"EditContactHeaderCell";
            EditContactHeaderCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

            return cell ?: createdCellNewly;

更新:
然后检查numberOfSectionsInTableView:(UITableView *)tableView方法是否返回正确的计数。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
         // returning count is correct?
    }

检查并设置表视图的委托和数据源。

相关问题