2

当我点击红色按钮时,我希望折叠 tableview 单元格

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if([[appDelegate.gHomeHeaderArray_AppDelegate objectAtIndex:section] getIsFolded]==true)      
    {       
        return 0;           
    }
    else
    {
       return 1;      
    }
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if([[appDelegate.gHomeHeaderArray_AppDelegate objectAtIndex:section] getIsFolded ]==true)
    {   
       return 0;

    }
    else
    {
        return 1; 
    }
}

-(void)buttonTapped:(id)sender;
{
    if([[appDelegate.gHomeHeaderArray_AppDelegate objectAtIndex:v] getIsFolded])
    {
         [[appDelegate.gHomeHeaderArray_AppDelegate objectAtIndex:v] setIsFolded:false];
    }
    else
    {
        [[appDelegate.gHomeHeaderArray_AppDelegate objectAtIndex:v] setIsFolded:true];
    }
    [listview reloadData];
}

当我录制一个按钮时,它会检查是否将 numberOfRowsInSection 设置为 0

它可以工作,但是 tableview 单元格移动到另一个标题视图下而不是隐藏。

欢迎任何评论

4

6 回答 6

1

这可能是您正在寻找的动画类型:

http://www.cocoacontrols.com/platforms/ios/controls/mpfoldtransition

您可能需要稍微调整一下,但如果您喜欢它的外观,这是值得的。

于 2012-05-24T12:55:20.117 回答
0

我使用以下方法在 Swift 中实现了折叠列表。当一个部分被折叠时,我仍然显示单行(标题),因此对于部分行数总是返回至少 1。这意味着折叠时部分不会消失。当折叠状态发生变化时,我们使用 tableView.reloadSections 来更新表格的相关部分(带有动画)

对于此示例,我在下面的代码中使用以下变量:

sectionHeadings[] : 部分标题数组

sectionVisible[] : 指示该部分是否折叠的 Bool 标志数组

sectionSubheadings[][] :对于每个部分,在展开部分时应该出现的副标题数组。

那么tableView的相关方法如下:

首先根据我们的节标题数组返回节数。

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return sectionHeadings.count
}

我们根据是否折叠来决定一个部分中有多少行。如果它被折叠,那么我们仍然显示一个单元格 - 这是部分标题,它始终可见:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of rows in the section.
    if sectionVisible[section]{
        return sectionSubheadings[section].count + 1
    }else{
        return 1
    }
}

然后,当我们选择一个单元格时,我们会检查当前状态并打开或关闭当前部分。同样的行为也可以附加到按钮上。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    // if we are selecting a sub heading then this means we want to actually process the click
    // if we are selecting a section heading (index 0) then we want to open or close the section
    if indexPath.row == 0{

        // this is a section heading

        // if the section is already open then we don't want to reopen it
        let bOpening = !sectionVisible[indexPath.section]

        // bunch all our updates together
        tableView.beginUpdates()

        // need to close any existing open sections
        // NB this is optional behaviour and ensures there is only one section open at a time
        for (var i:Int = 0;i<sectionVisible.count;i++){
            if sectionVisible[i]{
                sectionVisible[i] = false
                tableView.reloadSections(NSIndexSet(index: i), withRowAnimation: UITableViewRowAnimation.Automatic)
            }
        }

        if bOpening{
            // open this chapter
            sectionVisible[indexPath.section] = true
            tableView.reloadSections(NSIndexSet(index:indexPath.section), withRowAnimation: UITableViewRowAnimation.Automatic)
        }

        tableView.endUpdates()

    }else{

        // we have clicked a visible sub heading so process this as required
    }
}

在 tableView: cellForRowAtIndexPath 中提供单元格时,您可以根据索引值返回标题行或子标题行。Index=0 是标题,Index=n+1 是第 n 个子标题

于 2015-03-24T12:01:32.913 回答
0

我使用第一个示例:https ://github.com/floriankrueger/iOS-Examples--UITableView-Combo-Box/zipball/master 它很简单。这是一个总结

  1. 在某处保存部分打开或关闭状态
  2. 选择第0行时,使用动画添加或删除行

    NSMutableArray *indexPathArray = [[NSMutableArray alloc] init];
    for (int i = 1; i < 20; i++) {
        NSIndexPath *path0 = [NSIndexPath indexPathForRow:[indexPath row]+i inSection:[indexPath section]];
        [indexPathArray addObject:path0];
    }
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];
    //[self.tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];
    [self.tableView endUpdates];
    
  3. 获取选定的单元格并切换下拉箭头
  4. 取消选择单元格
于 2014-02-12T20:41:31.853 回答
0
    //use this method to reload the table,
    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
    //Pass list of indexpaths need to be reloaded, and pass UITableViewRowAnimationBottom this parameter
于 2012-05-24T11:42:33.357 回答
0

在 Swift 2 中执行此操作的非常简单的方法(尽管这不是 Swift 独有的;也可以在 Obj-C 中轻松完成):

extension UITableView {
    public func indexPathsForRowsInSection(section: Int) -> [NSIndexPath]? {
        return (0..<self.numberOfRowsInSection(section)).map{NSIndexPath(forRow: $0, inSection: section)}
    }
}

假设sender是 a UISwitch,但您可以使用任何 Bool 值执行此操作:

if let indexPaths = remindersTableView.indexPathsForRowsInSection(section) where !sender.on {
    tableView.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: .Middle)
} else if let indexPaths: [NSIndexPath] = (0..<numberOfRowsYouWantToAdd).map({NSIndexPath(forRow: $0, inSection: section)}) where sender.on {
    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Middle)
}
于 2016-03-05T00:27:19.850 回答