问题描述
我正在使用MacOs Big Sur和Xcode 12.2编写应用程序。
我正在尝试为联系人列表实现表格视图(来自Internet上的示例)。
大多数代码都是用于IOS的,很难移植到MacOS。
对于大多数功能,该应用程序运行良好。
我无法成功实现各节的页眉/页脚。
我确实成功完成了之前围绕CollectionView构建的项目。
但是我看不到CollectionView和TableView之间的类比。 在CollectionView中,我为页眉/页脚使用了一个笔尖。
以下是“可扩散数据源”示例的代码段。
我希望有人可以帮助解决我的问题。
'''
override func viewDidLoad() {
tableView.delegate = self
DataSource = makeDataSource()
tableView.dataSource = DataSource
update(with:ContactList(all: Contact.all,friends: [],family: [],coworkers: []),animate: true)
}
func makeDataSource() -> NSTableViewDiffableDataSource<Section,Contact> {
let reuseIdentifier = ContactTableCell.reuseIdentifier
return NSTableViewDiffableDataSource( tableView: tableView,cellProvider: { tableView,column,indexPath,contact in
guard let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(reuseIdentifier),owner: self) as? ContactTableCell else {
print("Failed to create results cell")
return NSView()
}
cell.configure(with: contact)
return cell
}
)
}
func update(with list: ContactList,animate: Bool = true) {
var snapshot = NSDiffableDataSourceSnapshot<Section,Contact>()
snapshot.appendSections([Section.all,Section.family,Section.coworkers,Section.friends])
snapshot.appendItems(list.all,toSection: .all)
snapshot.appendItems(list.family,toSection: .family)
snapshot.appendItems(list.coworkers,toSection: .coworkers)
snapshot.appendItems(list.friends,toSection: .friends)
DataSource.apply(snapshot,animatingDifferences: animate)
}
class ContactTableCell: NSTableCellView{
@IBOutlet weak var firstname: NSTextField!
@IBOutlet weak var lastname: NSTextField!
@IBOutlet weak var email: NSTextField!
@IBOutlet weak var userView: NSImageView!
static var reuseIdentifier: String {
return NSUserInterfaceItemIdentifier(String(describing: ContactTableCell.self)).rawValue
}
func configure(with contact:Contact){
print("\(#function)")
self.userView.imageScaling = .scaleProportionallyDown
self.userView.image = NSImage(contentsOfFile:contact.imagePath)
self.firstname.stringValue = contact.firstName //"\(contact.firstName) \(contact.lastName)"
self.lastname.stringValue = contact.lastName //contact.emailAddress
self.email.stringValue = contact.emailAddress
}
}
class SectionHeaderView: NSTableHeaderView {
static var reuseIdentifier: String {
return NSUserInterfaceItemIdentifier(String(describing: SectionHeaderView.self)).rawValue
}
lazy var headerLabel: NSTextField = {
print("\(#function)")
let label = NSTextField()
label.textColor = .red
label.font = NSFont.systemFont(ofSize: 15,weight: .medium)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func draw(_ dirtyRect: NSRect) {
print("\(#function)")
super.draw(dirtyRect)
// Drawing code here.
}
required init?(coder: NSCoder) {
print("\(#function)")
super.init(coder: coder)
setupView()
}
func setupView() {
print("\(#function)")
addSubview(headerLabel)
setupLayout()
}
func setupLayout() {
print("\(#function)")
NSLayoutConstraint.activate([
headerLabel.topAnchor.constraint(equalTo: self.topAnchor,constant: 2),headerLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor,constant: -2),headerLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor,constant: 8),headerLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor,constant: -8),])
}
} '''
解决方法
我遇到了类似的问题,查看源代码,在您的情况下可能需要做的是将这些设置为您的 diffableDataSource:
@property (copy,nullable) NSTableViewDiffableDataSourceRowProvider rowViewProvider;
@property (copy,nullable) NSTableViewDiffableDataSourceSectionHeaderViewProvider sectionHeaderViewProvider;
我认为没有节页脚 API,因此您可能需要在节的最后一个单元格项上显示某种页脚。