2016-09-21 52 views
0

我是新来的Swift,我想创建Tableview,我只有3行(早上,下午和晚上)。如果我点击Morning行,我的单元格必须展开。它必须显示keynumber时间8 - 12的用户号码。相同的下午和晚上。在UITableView单元格内如何显示指定的数组数据

我指定了数组数据User[]其中keynumber,时间和其他数据在那里。

我试图用if条件处理cellForRowAtIndexPath,但它只显示Morning行的一个用户键。它在该特定时间限制内不显示其他用户密钥。

回答

0

有一个尝试,就像这里

struct User { 
    var keynumber: Int 
    var time: NSData 
} 

class TableViewController: UITableViewController { 

var userArr : Array<User> = [] //raw user data 

var sortedUser : [String : Array<User>] = ["Morning": [], "Afternoon": [], "Night": []] 
var sectionStatusArr : [String: Bool] = ["Morning": false, "Afternoon": false, "Night": false] // section status array used to control expanding 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //classify user into corresponding group(time zone) 
    for _ in 0...19 { 
     let randomKey = Int(arc4random()%23) 
     let user = User(keynumber: randomKey, time: NSData()) 

     userArr.append(user) 
    } 

    //sort user: 8-12 -> morning, 13-18 -> afternoon, 19-8 -> night 
    for user in userArr{ 
     switch user.keynumber { 
     case 8,9,10,11,12: 
      sortedUser["Morning"]?.append(user) 
     case 13,14,15,16,17,18: 
      sortedUser["Afternoon"]?.append(user) 
     default: 
      sortedUser["Night"]?.append(user) 
     } 
    } 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return sortedUser.keys.count 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 


    var rowcount = 0 
    var shouldExpandSection = false 
    switch section { 
    case 0: 
     rowcount = (sortedUser["Morning"]?.count)! 
     shouldExpandSection = sectionStatusArr["Morning"]! 
    case 1: 
     rowcount = (sortedUser["Afternoon"]?.count)! 
     shouldExpandSection = sectionStatusArr["Afternoon"]! 
    default: 
     rowcount = (sortedUser["Night"]?.count)! 
     shouldExpandSection = sectionStatusArr["Night"]! 
    } 
    return shouldExpandSection ? rowcount : 0 
} 

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return 40 
} 

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 60 
} 

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let header = UIView(frame: CGRect(x: 0, y: 0, width: 375, height: 60)) 

    let nameBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 375, height: 60)) 
    nameBtn.backgroundColor = UIColor.cyan 
    nameBtn.tag = section 
    nameBtn.addTarget(self, action: #selector(self.headerTouched(sender:)), for: .touchUpInside) 

    switch section { 
    case 0: 
     nameBtn.setTitle("Morning", for: .normal) 
    case 1: 
     nameBtn.setTitle("Afternoon", for: .normal) 
    default: 
     nameBtn.setTitle("Night", for: .normal) 
    } 

    header.addSubview(nameBtn) 

    return header 
} 

func headerTouched(sender:UIButton){ 
    switch sender.tag { 
    case 0: 
     sectionStatusArr["Morning"] = !sectionStatusArr["Morning"]! 
    case 1: 
     sectionStatusArr["Afternoon"] = !sectionStatusArr["Afternoon"]! 
    default: 
     sectionStatusArr["Night"] = !sectionStatusArr["Night"]! 
    } 
    self.tableView.reloadData() 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var sectionArr : Array<User>= [] 
    switch indexPath.section { 
    case 0: 
     sectionArr = sortedUser["Morning"]! 
    case 1: 
     sectionArr = sortedUser["Afternoon"]! 
    default: 
     sectionArr = sortedUser["Night"]! 
    } 

    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) 

    for subview in cell.subviews{ 
     subview.removeFromSuperview() 
    } 

    let lab = UILabel(frame: CGRect(x: 0, y: 0, width: 375, height: 40)) 
    lab.text = "Un:" + String(sectionArr[indexPath.row].keynumber) 
    lab.textAlignment = .center 
    cell.addSubview(lab) 

    return cell 
} 

} 
+0

这是如何工作的:切换user.keynumber?另外我得到#selector错误(self.headerTouched(发件人:)) –

+0

这是一个简单的开关用例。根据您的分类规则:早上 - [8:00 - 12:00],下午 - [12:00 - 18:00],晚上 - [18:00 - 8:00]。你的IDE是什么,这个代码在Xcode8和Swift3.0中起作用。一旦我重新开始工作,我将在明天附上整个项目 –

+0

整个项目可以从[这里]下载(https://github.com/Millionaryearl/Stack-Overflow/tree/master/TableVC) –

1

魅力试试这个

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    @IBOutlet var tableView: UITableView! 
    var items: [String] = ["We", "Heart", "Swift"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
    } 


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell 

     cell.textLabel?.text = self.items[indexPath.row] 

     return cell 
    } 

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
     print("You selected cell #\(indexPath.row)!") 
    } 
} 

希望这有助于。

相关问题