Alexandru Vasiliu Alexandru Vasiliu - 5 months ago 33
Swift Question

ViewController does not conform to protocol UITableViewDataSource

I ran into a problem recently.

enter image description here

I'll post some code too. Tried the methods from internet but without success. Also, I have linked the 2 tables to the View Controller.

enter image description here

Here is some code.

class ViewController2: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var carImageView: UIImageView!
@IBOutlet weak var pieseDorite: UITableView!
@IBOutlet weak var pieseDisponibile: UITableView!


var fullNameArr : [String] = [] // i populate the string in a action button, no problem with the arrays
var fullNameArrDorit : [String] = []

override func viewDidLoad()
{
super.viewDidLoad()
carImageView.image = UIImage(named: ("simplu"))
carImageView.contentMode = .ScaleAspectFit

pieseDisponibile.delegate = self
pieseDisponibile.dataSource = self
self.view.addSubview(pieseDisponibile)

pieseDorite.delegate = self
pieseDorite.dataSource = self
self.view.addSubview(pieseDorite)
}


func tableView(pieseDisponibile: UITableView, numberOfRowsInSection section:Int) -> Int
{
return fullNameArr.count
}

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

let cell:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
cell.textLabel!.text = String(fullNameArr[indexPath.row])
return cell
}

func tableView2(pieseDorite: UITableView, numberOfRowsInSection section:Int) -> Int
{
return fullNameArrDorit.count
}

func tableView2(pieseDorite: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{

let cell2:UITableViewCell=UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell2")
cell2.textLabel!.text = String(fullNameArrDorit[indexPath.row])
return cell2
}

}


Also, tried to add all other functions, the problem persisted. I think I have linked something bad, I don't know.

Answer

Replace all tableView2 with tableView please, and leave only 1 each method. You need have same delegate methods for all UITableView instances. You can separate different instances inside this methods by comparing first parameter with your UITableView property. Also add number of section method:

override func viewDidLoad()
{
    super.viewDidLoad()
    carImageView.image = UIImage(named: "simplu")
    carImageView.contentMode = .ScaleAspectFit

    pieseDisponibile.delegate = self
    pieseDisponibile.dataSource = self
    view.addSubview(pieseDisponibile)

    pieseDorite.delegate = self
    pieseDorite.dataSource = self
    view.addSubview(pieseDorite)
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {return 1}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if tableView == pieseDisponibile {return fullNameArr.count}
    return fullNameArrDorit.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    if tableView == pieseDisponibile {
        let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
        cell.textLabel?.text = String(fullNameArr[indexPath.row])
        return cell
    }
    let cell2 = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell2")
    cell2.textLabel?.text = String(fullNameArrDorit[indexPath.row])
    return cell2
}
Comments