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

问题描述 投票:1回答:2

我正在学习如何为单个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
    }
}

有人能帮帮我吗?

ios swift uitableview tableview
2个回答
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进行强引用,这将被解除分配。您需要保留自己的强引用,然后使用该引用。


1
投票

这一行:

tableView?.dataSource = ProfileViewModel

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

我想你的意思

tableView?.dataSource = self
© www.soinside.com 2019 - 2024. All rights reserved.