2

赤いボタンをタップすると、テーブルビューのセルを折りたたむことができます

- (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に設定されているかどうかがチェックされます

動作しますが、テーブルビューセルは非表示ではなく別のヘッダービューの下に移動します。

コメントを歓迎します

4

6 に答える 6

12

UITableviewの折りたたみ機能について説明している次のリンクを確認してください

  1. https://github.com/floriankrueger/iOS-Examples--UITableView-Combo-Box/zipball/master

  2. http://www.codeproject.com/Articles/240435/Reusable-collapsable-table-view-for-iOS

  3. https://developer.apple.com/library/ios/#samplecode/TableViewUpdates/Introduction/Intro.html

于 2012-05-24T11:41:14.893 に答える
1

これはあなたが探している種類のアニメーションかもしれません:

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

少し調整する必要があるかもしれませんが、見た目が気に入った場合は価値があります。

于 2012-05-24T12:55:20.117 に答える
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

最初の例を使用します: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

次のアプローチを使用して、Swiftに折りたたみリストを実装しました。セクションが折りたたまれている場合でも、単一の行(ヘッダー)が表示されるため、セクションの行数として常に少なくとも1を返します。これは、折りたたんだときにセクションが消えないことを意味します。折りたたまれたステータスが変更されると、tableView.reloadSectionsを使用して、テーブルの関連部分を更新します(アニメーションを使用)

この例では、以下のコードで次の変数を使用します。

sectionHeadings []:セクション見出しの配列

sectionVisible []:そのセクションが折りたたまれているかどうかを示すブールフラグの配列

sectionSubheadings [] []:セクションごとに、セクションが展開されたときに表示される小見出しの配列。

tableViewに関連するメソッドは次のとおりです。

まず、セクション見出し配列に基づいてセクション数を返します。

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

セクションが折りたたまれているかどうかに応じて、セクションに含まれる行数を決定します。折りたたまれている場合でも、1つのセルが表示されます。これはセクションヘッダーであり、常に表示されます。

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

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と、UISwitch任意のブール値でこれを行うことができますが、

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 に答える