3 回答
TA贡献1851条经验 获得超4个赞
UITableView
tableView:didSelectRowAtIndexPath
tableView:didSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 0) { ///it's the first row of any section so it would be your custom section header ///put in your code to toggle your boolean value here mybooleans[indexPath.section] = !mybooleans[indexPath.section]; ///reload this section [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; }}
numberOfRowsInSection
mybooleans
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (mybooleans[section]) { ///we want the number of people plus the header cell return [self numberOfPeopleInGroup:section] + 1; } else { ///we just want the header cell return 1; }}
cellForRowAtIndexPath
TA贡献1784条经验 获得超2个赞
SectionHeaderView.swift
SectionHeaderView.xib
import UIKitprotocol SectionHeaderViewDelegate { func sectionHeaderView(sectionHeaderView: SectionHeaderView, sectionOpened: Int) func sectionHeaderView(sectionHeaderView: SectionHeaderView, sectionClosed: Int)}class SectionHeaderView: UITableViewHeaderFooterView { var section: Int? @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var disclosureButton: UIButton! @IBAction func toggleOpen() { self.toggleOpenWithUserAction(true) } var delegate: SectionHeaderViewDelegate? func toggleOpenWithUserAction(userAction: Bool) { self.disclosureButton.selected = !self.disclosureButton.selected if userAction { if self.disclosureButton.selected { self.delegate?.sectionHeaderView(self, sectionClosed: self.section!) } else { self.delegate?.sectionHeaderView(self, sectionOpened: self.section!) } } } override func awakeFromNib() { var tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "toggleOpen") self.addGestureRecognizer(tapGesture) // change the button image here, you can also set image via IB. self.disclosureButton.setImage(UIImage(named: "arrow_up"), forState: UIControlState.Selected) self.disclosureButton.setImage(UIImage(named: "arrow_down"), forState: UIControlState.Normal) }}
SectionHeaderView.xib
toggleOpen
disclosureButton
disclosureButton
toggleOpen
SectionInfo.swift
import UIKitclass SectionInfo: NSObject { var open: Bool = true var itemsInSection: NSMutableArray = [] var sectionTitle: String? init(itemsInSection: NSMutableArray, sectionTitle: String) { self.itemsInSection = itemsInSection self.sectionTitle = sectionTitle }}
import UIKitclass TableViewController: UITableViewController, SectionHeaderViewDelegate { let SectionHeaderViewIdentifier = "SectionHeaderViewIdentifier" var sectionInfoArray: NSMutableArray = [] override func viewDidLoad() { super.viewDidLoad() let sectionHeaderNib: UINib = UINib(nibName: "SectionHeaderView", bundle: nil) self.tableView.registerNib(sectionHeaderNib, forHeaderFooterViewReuseIdentifier: SectionHeaderViewIdentifier) // you can change section height based on your needs self.tableView.sectionHeaderHeight = 30 // You should set up your SectionInfo here var firstSection: SectionInfo = SectionInfo(itemsInSection: ["1"], sectionTitle: "firstSection") var secondSection: SectionInfo = SectionInfo(itemsInSection: ["2"], sectionTitle: "secondSection")) sectionInfoArray.addObjectsFromArray([firstSection, secondSection]) } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return sectionInfoArray.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if self.sectionInfoArray.count > 0 { var sectionInfo: SectionInfo = sectionInfoArray[section] as! SectionInfo if sectionInfo.open { return sectionInfo.open ? sectionInfo.itemsInSection.count : 0 } } return 0 } override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let sectionHeaderView: SectionHeaderView! = self.tableView.dequeueReusableHeaderFooterViewWithIdentifier(SectionHeaderViewIdentifier ) as! SectionHeaderView var sectionInfo: SectionInfo = sectionInfoArray[section] as! SectionInfo sectionHeaderView.titleLabel.text = sectionInfo.sectionTitle sectionHeaderView.section = section sectionHeaderView.delegate = self let backGroundView = UIView() // you can customize the background color of the header here backGroundView.backgroundColor = UIColor(red:0.89, green:0.89, blue:0.89, alpha:1) sectionHeaderView.backgroundView = backGroundView return sectionHeaderView } func sectionHeaderView(sectionHeaderView: SectionHeaderView, sectionOpened: Int) { var sectionInfo: SectionInfo = sectionInfoArray[sectionOpened] as! SectionInfo var countOfRowsToInsert = sectionInfo.itemsInSection.count sectionInfo.open = true var indexPathToInsert: NSMutableArray = NSMutableArray() for i in 0..<countOfRowsToInsert { indexPathToInsert.addObject(NSIndexPath(forRow: i, inSection: sectionOpened)) } self.tableView.insertRowsAtIndexPaths(indexPathToInsert as [AnyObject], withRowAnimation: .Top) } func sectionHeaderView(sectionHeaderView: SectionHeaderView, sectionClosed: Int) { var sectionInfo: SectionInfo = sectionInfoArray[sectionClosed] as! SectionInfo var countOfRowsToDelete = sectionInfo.itemsInSection.count sectionInfo.open = false if countOfRowsToDelete > 0 { var indexPathToDelete: NSMutableArray = NSMutableArray() for i in 0..<countOfRowsToDelete { indexPathToDelete.addObject(NSIndexPath(forRow: i, inSection: sectionClosed)) } self.tableView.deleteRowsAtIndexPaths(indexPathToDelete as [AnyObject], withRowAnimation: .Top) } }}
- 3 回答
- 0 关注
- 1362 浏览
添加回答
举报