将表数据源设置为某个类时出错

时间:2017-12-17 10:49:06

标签: ios swift uitableview tableview

我目前正在学习如何为单个tableView创建多个单元格类型,当我尝试在Swift 4中为UITableView设置数据源时出现错误。

我收到如下错误

  

无法指定类型的值' ProfileViewModel.Type'输入' UITableViewDataSource?'

我收到此错误消息的代码就是这个

tableView?.dataSource = ProfileViewModel

有关代码的详细信息如下。此类不在原始ViewController类中,但我使用UITableViewDataSource声明了该类。

class ProfileViewModel: NSObject, UITableViewDataSource {
    var items = [ProfileViewModelItem]()

    init(profile: Profile) {
        super.init()
        guard let data = dataFromFile(filename: "ServerData") else {
            return
        }

        let profile = Profile(data: data)

        if let name = profile.fullName, let pictureUrl = profile.pictureUrl {
            let nameAndPictureItem = ProfileViewModelNameAndPictureItem(pictureUrl: pictureUrl, userName: name)
            items.append(nameAndPictureItem)
        }
        if let about = profile.about {
            let aboutItem = ProfileViewModelAboutItem(about: about)
            items.append(aboutItem)
        }
        if let email = profile.email {
            let dobItem = ProfileViewModelEmailItem(email: email)
            items.append(dobItem)
        }
        let attributes = profile.profileAttributes
        if !attributes.isEmpty {
            let attributesItem = ProfileViewModelAttributeItem(attributes: attributes)
            items.append(attributesItem)
        }
        let friends = profile.friends
        if !profile.friends.isEmpty {
            let friendsItem = ProfileViewModeFriendsItem(friends: friends)
            items.append(friendsItem)
        }
    }

}

extension ProfileViewModel {
    func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items[section].rowCount
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // config
    }
}

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

这一行:

tableView?.dataSource = ProfileViewModel

您正尝试将类型分配给tableView.dataSource。表视图的数据源不可能是类型,对吗?它应该是符合UITableViewDataSource的类型的对象

我认为你的意思是

tableView?.dataSource = self

答案 1 :(得分:0)

您指的是类,但您需要引用该类的实例。因此,您需要实例化ProfileViewModel

class ViewController {
    @IBOutlet weak var tableView: UITableView!

    var profileViewModel: ProfileViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let profile = ...
        profileViewModel = ProfileViewModel(profile: profile)   // it doesn't look like you need this parameter, so remove it if you don't really need it

        tableView?.dataSource = profileViewModel

        ...
    }
}

注意,我没有直接执行以下操作:

tableView?.dataSource = ProfileViewModel(profile: ...)

问题是tableView没有对其dataSource保持强引用,这将被解除分配。您需要保留自己的强引用,然后使用该引用。