user1555112
user1555112

Reputation: 1987

How to have one static cell in a dynamic tableview?

I would like to use a UITableView to have 2 static cells on top of a list of dynamic cells. As far as I understand, I have to use a dynamic prototype tableView. But I don't understand how to add 2 static cells and design them, eg. adding a textfield to the first and a label to the second.

What do I have to do in my storyboard? And what do I have to do inside the Controller? How can I differentiate the static from the dynamic cells?

EDIT: I tried this for testing:

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cardCell", forIndexPath: indexPath) as CardTableViewCell
    
    //static cell
    if (indexPath.row < 2) {
        cell.dyn.text = "static \(indexPath.row)"
        return cell;
    }

    // Configure the cell...
    cell.dyn.text = "buh"

    return cell
}

this results in this:

enter image description here

Later when I use real data I will miss the first 2 data rows... Can I somehow "reset" the row counter after I created my static cells?

And how can I modify the 2 static cells? For adding a textfield and labels? Or do I have to do this programmatically?

Upvotes: 10

Views: 22267

Answers (3)

Yes you can by having static cells be IBOutlet properties and in the tableView(_:cellForRowAt:) you can return those properties for any index paths you want

Here's an example:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  switch indexPath.row {
  case 0:
    return firstStaticCell
  case 1:
    return secondStaticCell
  default:
    let cell = tableView.dequeueReusableCell(withIdentifier: "DynamicCell", for: indexPath)

    cell.textLabel?.text = "Dynamic \(indexPath.row + 1)"
    return cell
  }
}

enter image description here

Upvotes: 0

user1555112
user1555112

Reputation: 1987

I found help here: Mixing static and dynamic sections in a grouped table view

And my solution looks like this:

1. enter image description here

  1. Add and layout the static cells: enter image description here

  2. Give each cell a unique name and add them as outlet to the TableViewCell class

  3. Adjust the code:

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (section == 2){ // my dynamic cell is index 2
            return 5 // just for testing, add here yourrealdata.count
        }
        return 1 // for static content return 1
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        var cell: CardTableViewCell!
    
        if (indexPath.section == 0) {
            cell = tableView.dequeueReusableCellWithIdentifier("static1", forIndexPath: indexPath) as CardTableViewCell
    
            cell.cardSetName?.text = self.cardSetObject["name"] as String
    
        }else if (indexPath.section == 1) {
            cell = tableView.dequeueReusableCellWithIdentifier("static2", forIndexPath: indexPath) as CardTableViewCell // just return the cell without any changes to show whats designed in storyboard 
    
        }else if (indexPath.section == 2) {
            cell = tableView.dequeueReusableCellWithIdentifier("cardCell", forIndexPath: indexPath) as CardTableViewCell
            cell.dyn.text = "row \(indexPath.row)" // return test rows as set in numberOfRowsInSection
        }
    
        return cell;
    } 
    

End results will look like this:

enter image description here

I hope I can help someone with the same question :)

Upvotes: 20

Syed Ali Salman
Syed Ali Salman

Reputation: 2915

you could use something like this to use or display your static cell

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return numberOfDynamicCells + 1;
}

and in you cellForRowAtIndexPath datasource you may use something like this.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0){
// go ahead to display your static Cell
}
else{
//go ahead to display your dynamic cells.
}
return yourCell;
}

here is code for swift.

func numberOfRowsInSection(_ section: Int) -> Int{
return numberOfDynamicCells + 1
}

and in you cellForRowAtIndexPath datasource you may use something like this.

func cellForRowAtIndexPath(_ indexPath: NSIndexPath) -> UITableViewCell?{
if indexPath.row = 0{
// go ahead to display your static Cell
}
else{
//go ahead to display your dynamic cells.
}
return yourCell;
}

Good Luck...

Upvotes: 4

Related Questions