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

Posted

技术标签:

【中文标题】将表数据源设置为某个类时出错【英文标题】:Error when setting table datasource to a certain class 【发布时间】:2017-12-17 10:49:05 【问题描述】:

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

有人可以帮帮我吗?

【问题讨论】:

不相关,您的init 在您传递Profile 时不太有意义,但您似乎忽略了该参数。你可能想回顾一下…… 感谢您的评论罗!我没有注意到这一点。我要修好它。我想我不需要在初始化之后声明配置文件。 【参考方案1】:

这一行:

tableView?.dataSource = ProfileViewModel

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

我想你是说

tableView?.dataSource = self

【讨论】:

感谢您的评论!哦,我明白了。自从我上个月开始学习 swift 以来,老实说,我不明白类型和对象之间的区别,但类型就像对象的类型,我将一个类型传递给数据源,我猜它应该是一个对象?【参考方案2】:

您指的是类,但您需要引用该类的一个实例。因此,您需要实例化您的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 的强引用,这将被释放。您需要保留自己对它的强引用,然后使用该引用。

【讨论】:

感谢您的评论罗!我不知道参考的东西。我试过你的方法,效果很好。

以上是关于将表数据源设置为某个类时出错的主要内容,如果未能解决你的问题,请参考以下文章

将表定义上传到 phpmyadmin 时出错

将表迁移到 db 时出错...表已存在

SQL:如何将一个表中某个字段的值全部更新到另外一个表相应的字段

ORA-29280 Oracle SQL 开发人员在尝试将表内容导出为 csv 时出错

mysq将表数据导入文件并将文件从远程服务下载到本地

拆分视图控制器 - 将表视图设置为初始视图控制器