一尘不染

在Swift中将数据源分离到另一个类

swift

我正在尝试按照本文objc.io问题#1较浅的视图控制器中所述保持视图控制器的清洁。我在Objective-
C中测试了此方法,并且效果很好。我有一个单独的类,它实现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关键字,否则它将产生编译时错误。

我对这里发生的事情一无所知。有人可以帮我吗?

谢谢。


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

为数据源创建一个属性,并将其与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

  }
}
2020-07-07