我正在学习如何为单个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
}
}
有人能帮帮我吗?
您指的是类,但您需要引用该类的实例。因此,您需要实例化您的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
进行强引用,这将被解除分配。您需要保留自己的强引用,然后使用该引用。
这一行:
tableView?.dataSource = ProfileViewModel
您正在尝试将类型分配给tableView.dataSource
。表视图的数据源不可能是一个类型,对吗?它应该是符合UITableViewDataSource
的类型的对象。
我想你的意思
tableView?.dataSource = self