I'm new to generics in Swift.
class MyTableViewController<Element>: UITableViewController {
var data = [Element]()
}
class AnotherTableViewController: MyTableViewController<String> {}
MyTableViewController
only overrides numberOfRowsInSection
and didSelectRowAtIndexPath
.
When I try to show AnotherTableViewController
, this is the error I get when I try to initialize one: ...cannot be constructed because it has no accessible initializers
.
I'm don't understand why I get this error since all my member variables are initialized. Does anyone know why I get this error?
Thanks
EDIT
Here's the actual code:
class CRTableViewController<Element>: UITableViewController {
var collecting = false {
didSet {
switchCollectingMode()
}
}
var data = [Element]()
var collectedData = [String:Element]()
private func switchCollectingMode() {
tableView.allowsMultipleSelection = collecting
title = collecting ? "Collect Mode" : "Normal Mode"
if !collecting {
for (key, _) in collectedData {
let indexPath = NSIndexPath(forRow: Int(key)!, inSection: 0)
tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .None
}
collectedData.removeAll()
}
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if collecting {
if cell?.accessoryType == .Checkmark {
cell?.accessoryType = .None
collectedData.removeValueForKey(String(indexPath.row))
} else {
cell?.accessoryType = .Checkmark
collectedData[String(indexPath.row)] = data[indexPath.row]
}
} else {
cell?.accessoryType = .None
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
}
class CREventsTableViewController: CRTableViewController<Event> {
var model: ChronoModel!
var eventsReferense: FIRDatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
model = delegate.model
eventsReferense = model.databaseReferense.child("events")
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("EventCell", forIndexPath: indexPath)
let event = data[indexPath.row]
cell.textLabel?.text = event.title
return cell
}
}