遵循Swift中ViewController中的协议

试图符合Swift UIViewController子类中的UITableViewDataSource和UITableViewDelegate。

class GameList: UIViewController { var aTableView:UITableView = UITableView() override func viewDidLoad() { super.viewDidLoad() aTableView.delegate = self aTableView.dataSource = self self.view.addSubview(aTableView) //errors on both lines for not conforming } } 

文档说,你应该遵循以下方面的class :但通常是超类的地方。 另:不起作用。 在超类之后使用逗号分隔列表也不起作用

编辑:

在下面find答案。 class GameList: UIViewController, UITableViewDataSource, UITableViewDelegate {

还必须采用每个协议的所有必需的方法,我最初并没有这样做。

您使用逗号:

 class GameList: UIViewController, UITableViewDelegate, UITableViewDataSource { // ... } 

但要意识到,超级类必须是逗号分隔列表中的第一项。

如果你没有采用协议所需的全部方法,将会出现编译器错误。 你必须得到所有必要的方法!

随着XCode6-Beta7的发布,

我注意到UITableViewDataSource的协议方法改变了一点点,听起来一致符合协议错误,在beta6工作正常。

这些是根据UITableViewDataSource协议实现的必需的方法:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // insert code} func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // insert code } 

您可能需要重新检查差异或重新实现您认为刚刚实现的委托方法。

你必须在这里实现两个require方法:

 func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int { return 10 } func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell") cell.text = "Row #\(indexPath.row)" cell.detailTextLabel.text = "Subtitle #\(indexPath.row)" return cell } 

此外,从Delegate类复制所有非可选函数也很重要。 Cmd +单击UITableViewDatasource并按原样复制这两个定义。

对于我在beta7中,UITableViewDatasource有

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

我的实现:

 var items = ["Apple", "Pear", "Banana"] func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default") cell.textLabel?.text = items[indexPath.row] cell.detailTextLabel?.text = "Test" return cell } 

用户这些方法:数据源方法有变化 –

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell protocol UITableViewDataSource : NSObjectProtocol { ****func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell**** optional func numberOfSectionsInTableView(tableView: UITableView) -> Int // Default is 1 if not implemented optional func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // fixed font style. use custom view (UILabel) if you want something different optional func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? // Editing // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. optional func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool // Moving/reordering // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath: optional func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool // Index optional func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]! // return list of section titles to display in section index view (eg "ABCD...Z#") optional func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int // tell table which section corresponds to section title/index (eg "B",1)) // Data manipulation - insert and delete support // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change // Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead optional func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) // Data manipulation - reorder / moving support optional func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) } 

乌尔代码将起作用!