将表数据源设置为某个类时出错
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
的强引用,这将被释放。您需要保留自己对它的强引用,然后使用该引用。
【讨论】:
感谢您的评论罗!我不知道参考的东西。我试过你的方法,效果很好。以上是关于将表数据源设置为某个类时出错的主要内容,如果未能解决你的问题,请参考以下文章
SQL:如何将一个表中某个字段的值全部更新到另外一个表相应的字段