在MacO上具有可扩散数据源的TableView

问题描述

我正在使用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,因此您可能需要在节的最后一个单元格项上显示某种页脚。