我正在尝试按照本文objc.io问题#1较浅的视图控制器中所述保持视图控制器的清洁。我在Objective- C中测试了此方法,并且效果很好。我有一个单独的类,它实现UITableViewDataSource方法。
UITableViewDataSource
#import "TableDataSource.h" @interface TableDataSource() @property (nonatomic, strong) NSArray *items; @property (nonatomic, strong) NSString *cellIdentifier; @end @implementation TableDataSource - (id)initWithItems:(NSArray *)items cellIdentifier:(NSString *)cellIdentifier { self = [super init]; if (self) { self.items = items; self.cellIdentifier = cellIdentifier; } return self; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.items.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath]; cell.textLabel.text = self.items[indexPath.row]; return cell; } @end
从tableview控制器中,我要做的就是实例化此类的实例并将其设置为tableview的数据源,并且它可以完美地工作。
self.dataSource = [[TableDataSource alloc] initWithItems:@[@"One", @"Two", @"Three"] cellIdentifier:@"Cell"]; self.tableView.dataSource = self.dataSource;
现在我正在尝试在Swift中做同样的事情。首先,这是我的代码。它几乎是上述Objective-C代码的翻译。
import Foundation import UIKit public class TableDataSource: NSObject, UITableViewDataSource { var items: [AnyObject] var cellIdentifier: String init(items: [AnyObject]!, cellIdentifier: String!) { self.items = items self.cellIdentifier = cellIdentifier super.init() } public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell cell.textLabel?.text = items[indexPath.row] as? String return cell } }
我这样称呼它。
let dataSource = TableDataSource(items: ["One", "Two", "Three"], cellIdentifier: "Cell") tableView.dataSource = dataSource
但是该应用程序因以下错误而崩溃。
-[NSConcreteNotification tableView:numberOfRowsInSection:]:无法识别的选择器已发送到实例
我检查了和的init方法,TableDataSource各项和单元格标识符都通过了。我必须声明UITableViewDataSource方法public并删除override关键字,否则它将产生编译时错误。
init
TableDataSource
public
override
我对这里发生的事情一无所知。有人可以帮我吗?
谢谢。
为数据源创建一个属性,并将其与tableview一起使用。
class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var dataSource:TableDataSource! override func viewDidLoad() { super.viewDidLoad() dataSource = TableDataSource(items: ["One", "Two", "Three"], cellIdentifier: "Cell") tableView.dataSource = dataSource } }