swift_USer
swift_USer

Reputation: 159

Inside UITableView cell how to display the specified array data

I am new to Swift and I am trying to create Tableview in which I have only 3 Rows (Morning, Afternoon, and Night). If I click on the Morning row my cell must expand. It must display keynumber number of user whose time 8 - 12. Same for Afternoon and Night.

I have specified array data of User[] in which keynumber, time and other data are there.

I tried to do with if condition in cellForRowAtIndexPath but it displays only one user key for the Morning row. It doesn't display another users key in that particular time limit.

Upvotes: 0

Views: 60

Answers (2)

Kamlesh Shingarakhiya
Kamlesh Shingarakhiya

Reputation: 2777

Try This

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)!")
    }
}

Hope this helps.

Upvotes: 1

Chen Wei
Chen Wei

Reputation: 521

Have a try, works like a charm here

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
}

}

Upvotes: 0

Related Questions