start new:
tmux
start new with session name:
tmux new -s myname
| struct Section { | |
| var name: String | |
| var items: [String] | |
| var collapsed: Bool | |
| init(name: String, items: [Item], collapsed: Bool = false) { | |
| self.name = name | |
| self.items = items | |
| self.collapsed = collapsed | |
| } |
| class CollapsibleTableViewHeader: UITableViewHeaderFooterView { | |
| let titleLabel = UILabel() | |
| let arrowLabel = UILabel() | |
| override init(reuseIdentifier: String?) { | |
| super.init(reuseIdentifier: reuseIdentifier) | |
| contentView.addSubview(titleLabel) | |
| contentView.addSubview(arrowLabel) | |
| } | |
| protocol CollapsibleTableViewHeaderDelegate { | |
| func toggleSection(header: CollapsibleTableViewHeader, section: Int) | |
| } | |
| class CollapsibleTableViewHeader: UITableViewHeaderFooterView { | |
| var delegate: CollapsibleTableViewHeaderDelegate? | |
| var section: Int = 0 | |
| ... | |
| override init(reuseIdentifier: String?) { | |
| super.init(reuseIdentifier: reuseIdentifier) | |
| ... |
| override init(reuseIdentifier: String?) { | |
| ... | |
| // arrowLabel must have fixed width and height | |
| arrowLabel.widthAnchor.constraintEqualToConstant(12).active = true | |
| arrowLabel.heightAnchor.constraintEqualToConstant(12).active = true | |
| titleLabel.translatesAutoresizingMaskIntoConstraints = false | |
| arrowLabel.translatesAutoresizingMaskIntoConstraints = false | |
| } | |
| override func layoutSubviews() { | |
| super.layoutSubviews() |
| override func numberOfSectionsInTableView(tableView: UITableView) -> Int { | |
| return sections.count | |
| } |
| override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
| return sections[section].collapsed ? 0 : sections[section].items.count | |
| } |
| override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { | |
| let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as? CollapsibleTableViewHeader ?? CollapsibleTableViewHeader(reuseIdentifier: "header") | |
| header.titleLabel.text = sections[section].name | |
| header.arrowLabel.text = ">" | |
| header.setCollapsed(sections[section].collapsed) | |
| header.section = section | |
| header.delegate = self | |
| return header | |
| } |
| override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { | |
| let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell? ?? UITableViewCell(style: .Default, reuseIdentifier: "cell") | |
| cell.textLabel?.text = sections[indexPath.section].items[indexPath.row] | |
| return cell | |
| } |
| override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { | |
| return sections[(indexPath as NSIndexPath).section].collapsed ? 0 : UITableViewAutomaticDimension | |
| } |