Kam K Kam K - 5 months ago 31
Swift Question

iOS : 'MyViewController' does not conform to protocol 'UITableViewDataSource'


  • I am new to
    IOS
    swift
    development. I used to work with previous
    Xcode 6 beta
    .

  • I have downloaded the
    Xcode 6.0.1
    and I can not get this to work
    Xcode Version: 6.0.1

  • I am still getting "'
    MyViewController
    ' does not confirm to protocol '
    UITableViewDataSource
    ' " when I try to run the example.



Can someone please help me? I have gone through other issues on this site and added all the required functions for "
UITableViewDataSource
";




import UIKit
import Foundation

class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{

var array1:[String] = ["one","two","three","four"]

var array2:[String] = ["IOS","Android","java","c++","Swift"]

let sectionCount = 2

var myTableView:UITableView!

// init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
// var rect = CGRectMake(0, 0, 220, 320)
// myTableView = UITableView(frame: rect, style: UITableViewStyle.Grouped)
// super.init(nibName: nil, bundle: nil)
// // Custom initialization
// }

override func viewDidLoad() {
super.viewDidLoad()

var rect = CGRectMake(0, 0, 320, 600)
myTableView = UITableView(frame: rect, style: UITableViewStyle.Grouped)
myTableView!.delegate = self
myTableView!.dataSource = self
self.view.addSubview(myTableView)

}

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


//dataSourrce
//tableview:tableview,section:
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
switch section{
case 0:
return array1.count
case 1:
return array2.count
default:
return 1
}

}


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

//---cellstart----
let identifier = "identifier"
// var cell:UITableViewCell
//cell
var cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? MyCell
if cell == nil {
// cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifier)
cell = MyCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifier)
}
//---cellend----

switch indexPath.section{
case 0:
// cell!.textLabel.text = array1[indexPath.row]
cell!.myLable!.text = array1[indexPath.row]
case 1:
// cell!.textLabel.text = array2[indexPath.row]
cell!.myLable!.text = array2[indexPath.row]
default:
println()
}
var image = UIImage(named: "images/qq.png")
// cell!.imageView.image = image
cell!.myImageView!.image = image
// cell!.detailTextLabel.text = "\(indexPath.section)\(indexPath.row)
return cell!
}

//dataSourrce
func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
return sectionCount
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
var title:String? = nil
switch section {
case 0:
title = "Num"
case 1:
title = "Prog"
default:
title = nil
}
return title
}

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
println("Test\(indexPath.section) \(indexPath.row)")
}


func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60.0
}



func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int {}

func pickerView(pickerView: UIPickerView!,numberOfRowsInComponent component: Int) -> Int{}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?{
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{
}

}


***************** My Cell Class ***********************************

import Foundation
import UIKit

class MyCell: UITableViewCell {

let indetifier:String = "indetifier"


var myLable:UILabel?


var myImageView:UIImageView?

override init(style: UITableViewCellStyle, reuseIdentifier: String!)
{
super.init(style: .Subtitle, reuseIdentifier: indetifier)

var rect = CGRectMake(10, 0, 60, 30)
self.myLable = UILabel()
self.myLable!.frame = rect
self.myLable!.textColor = UIColor.redColor()
self.contentView.addSubview(self.myLable!)

var imageRect = CGRectMake(160, 10, 40, 40)
self.myImageView = UIImageView()
self.myImageView!.frame = imageRect
self.contentView.addSubview(self.myImageView!)


}

required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

Answer

You need to look at the whole error message. This specific message includes additional information about which methods are missing:

Type 'MyViewController' does not conform to protocol 'UITableViewDataSource'
Protocol requires function 'tableView(_:numberOfRowsInSection:)' with type '(UITableView, numberOfRowsInSection: Int) -> Int'
Candidate has non-matching type '(UITableView!, numberOfRowsInSection: Int) -> Int'

So... your numberOfRowsInSection takes an optional UITableView, and should take a required UITableView (this is a change they made between 6 and 6.1, all UITableView delegate and datasource methods now take required tableView and indexPath values)

Comments