CHM
CHM

Reputation: 621

Call 2 different custom UITableViewCells into UITableViewController

I've been scouring the web trying to figure this out but can't find a clear answer. Here's what's going on:

I've created a UITableViewController called MainTableViewController and I have two custom cells that live in that: "FirstCell" and "SecondCell". They both use that naming convention as their reuse identifiers. I've also created cell class files for each: "FirstTableViewCell" and "SecondTableViewCell" that I've assigned each cell accordingly. I've also created IBOutlets for all the objects in the cells within each UITableViewCell class file.

So in MainTableViewController I have no problem getting "FirstCell" loaded. I'm doing that like so:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("FirstCell") as! FirstTableViewCell

    cell.friendfirstnameLabel.text = "Michael"
    cell.friendImageView.image = UIImage(named: "mikepic")

    return cell
}

How do I now call "SecondCell"? I know I will need to change my return to 2. But then how do I change the dequeueReusableCellWithIdentifier and cellForRowAtIndexPath code to make both my cells work? "Second Cell" has a radically different layout with different objects defined.

Upvotes: 1

Views: 67

Answers (4)

Rajat
Rajat

Reputation: 11127

try this

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return yourArrayCount
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

   if indexPath.row % 2 == 0 { 
    let cell = tableView.dequeueReusableCellWithIdentifier("FirstCell") as! FirstTableViewCell

    cell.friendfirstnameLabel.text = "Michael"
    cell.friendImageView.image = UIImage(named: "mikepic")

    return cell
  } else {
    let cell = tableView.dequeueReusableCellWithIdentifier("SecondCell") as! SecondTableViewCell

    cell.friendfirstnameLabel.text = "Michael"
    cell.friendImageView.image = UIImage(named: "mikepic")

    return cell
  }
}

Upvotes: 1

AFTAB MUHAMMED KHAN
AFTAB MUHAMMED KHAN

Reputation: 2186

here i see you have static text to show in the cell view. Usually we have NSArray of data to populate the data in tableview and we define the count in umberOfRowsInSection method so it will be very easy if you know what data you want to display in which cell like that you can easily use If statement for selecting your desire table cellview

 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayCount
}

after checking count you can do this by if statement

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
NSUInteger row = [indexPath row]; 

if [yourArray objectAtIndex:row] =="Michael" { 
let cell = tableView.dequeueReusableCellWithIdentifier("FirstCell") as! FirstTableViewCell

cell.friendfirstnameLabel.text = "Michael"
cell.friendImageView.image = UIImage(named: "mikepic")

return cell
} else {
let cell = tableView.dequeueReusableCellWithIdentifier("SecondCell") as! SecondTableViewCell

cell.friendfirstnameLabel.text = “Unknown"
cell.friendImageView.image = UIImage(named: "mikepic")

 return cell
 }
}

Upvotes: 0

Rony Rozen
Rony Rozen

Reputation: 4047

You should simply change the parameter value you send to dequeueReusableCellWithIdentifier based on [indexPath row]. If it's 0, use "firstCell" and if it's 1, use "secondCell" and create a cell for the matching object type.

Upvotes: 0

Rohit Kumar
Rohit Kumar

Reputation: 887

You just need to deque your second cell with the reuse identifier assigned. This is completely on your requirements when you want to use first and when second.

Upvotes: 0

Related Questions