Asim Khan
Asim Khan

Reputation: 584

Dynamic Tableview inside a Static tableview Cell

I wanna populate a dynamic tableview inside a static tableview cell, by the same class for both of these. As you can see in the picture under the cell 'GRE Test Information'.

Helping Picture

I'm using the code inside the the class named as MenuController, which is a tableview controller.

class MenuController: UITableViewController,MFMailComposeViewControllerDelegate        {

@IBOutlet weak var tablle: UITableView!

var items = [String]()
override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    items = ["A  "," BB "]

    tablle.delegate = self
    tablle.dataSource = self

    self.tablle.registerClass(MainTableViewCell.self, forCellReuseIdentifier: "cellNew")
}


// Table Data Source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

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


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
    -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell

        print("Aasim Khaan")

        cell.customCell01.text = items[indexPath.row]


        return cell
}


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

But it's not populating that at runtime, and says

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier cellNew - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

However I'm using the same identifier named as cellNew both in the code and storyboard.

Upvotes: 0

Views: 3348

Answers (4)

Derek
Derek

Reputation: 2112

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier cellNew - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

However I'm using the same identifier named as cellNew both in the code and storyboard.

You're getting this error because you are dequeing/retrieving the prototype cell from the wrong table!

The line in your cellForRowAtIndexPath should be:

let cell = tablle.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell

Having said that, even once that is working, asking a tableViewController to act as data source and delegate for both a static and a dynamic table causes problems later.

Upvotes: 0

NRitH
NRitH

Reputation: 13903

While the existing answers explain how you can do this, they don't address whether you should do this. From the example you provided, it seems that all you need is a single UITableView with multiple dynamic cell types. Each cell type can specify its contentInsets to indent the content as needed.

Upvotes: 0

Asim Khan
Asim Khan

Reputation: 584

Well after astonishing efforts regarding this one, I've found the solution. Concerning the following: Swift: TableView within Static UITableViewCell

Where the problem solver says : As far as I can determine by experimenting with this, you can't use the same UITableViewController as the data source and delegate of both table views. With a static table view, you're not supposed to implement the data source methods at all. The strange thing is, even if I disconnect the data source and delegate connections between my static table view and the table view controller, that table view still calls numberOfRowsInSection in my table view controller class. If I explicitly set the data source to nil in code, that stops it from calling the data source methods, but the embedded dynamic table view also fails to call them, so this structure doesn't work.

However, you can get around this by using a different object to be the data source and delegate of your embedded dynamic table view. Make an IBOutlet for your embedded table view, and set its data source and delegate to this new object (The class is DataSource in this example, and it's a subclass of NSObject).

I've modified my code in this way now :

import Foundation
import UIKit
import MessageUI

class DataSource: NSObject, UITableViewDataSource, UITableViewDelegate {

var items : [String] = ["GRE Test Structure ","GRE Score "]

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1;
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2;
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellNew", forIndexPath: indexPath) as! MainTableViewCell
        cell.customCell01.text = items[indexPath.row]
        return cell
    }
}


class MenuController: UITableViewController,MFMailComposeViewControllerDelegate {

  @IBOutlet var tablle0: UITableView!
  @IBOutlet weak var tablle: UITableView!
  var dataSource = DataSource()

  override func viewDidLoad() {
      super.viewDidLoad()

      // Uncomment the following line to preserve selection between presentations
      // self.clearsSelectionOnViewWillAppear = false

      // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
      // self.navigationItem.rightBarButtonItem = 
      self.editButtonItem()
      tablle.delegate = dataSource
      tablle.dataSource = dataSource
  }

}

Now it works exactly fine.

Here is the result shown by a screenshot

Upvotes: 2

user3182143
user3182143

Reputation: 9609

in viewDidLoad

// First Register the UITableViewcell class from nib 
let cellNib = UINib(nibName: "MainTableViewCell", bundle: bundle)
self.tableView.registerNib(cellNib, forCellReuseIdentifier:"cellNew")

Then Check with below screeshots

STEP 1: Select MainTableViewCell from Identity Inspector-Custom Class-Click Class Drop Down arrow.It shows you list.From that you can click the MainTableViewCell

enter image description here

STEP 2:Once you click that it shows the name with selected table view cell.

enter image description here

Upvotes: 0

Related Questions