【问题标题】:NSTableView autosave column widths does not restore columns when autosavename is changed更改自动保存名称时,NSTableView 自动保存列宽不会恢复列
【发布时间】:2021-11-27 08:54:51
【问题描述】:

根据 Apple Docs,当您更改 NSTableView 的自动保存名称时,它将从 UserDefaults 中读取该自动保存名称的列宽并相应地调整列。

我似乎无法让它在以下情况下工作:

用户可以选择两个选项之一来在 tableView 中显示更改或会话。 Changes 与 Sessions 有不同的列。

因此,为了在不使用两个单独的 NSTableView 的情况下实现这一点,我认为当用户更改选择时,我可以简单地删除现有列并将它们替换为所需的列,然后将自动保存名称设置为“ChangesTableView”或“SessionsTableView”。然后根据 Apple 文档,tableView 将读取保存的设置并调整列。

这似乎成功了一半。

如果我在设置 autosavename = "Name1" 后关闭应用程序并使用 autosavename = "Name2" 重新启动应用程序,则该表将没有保存的列数据。

如果我将 autosavename 更改为“Name1”,之前保存的位置将被恢复。

但是,如果我现在将名称更改为“Name2”并更改列位置并使用 autosavename =“Name2”重新启动应用程序,那么新位置将恢复。

但是,如果我现在再次更改 autosavename = "Name1",则之前从 "Name1" 中保存的位置不再存在,并且列恢复为默认值。

似乎当您更改自动保存名称时,旧名称下的设置会被删除。因此,您似乎无法以两个不同的自动保存名称保存位置。

文档说,如果您将 autosavename 设置为 NIL,那么之前保存的所有数据都将被清除。没有提到如果您更改自动保存名称,还会从任何以前使用的自动保存名称中清除数据。

任何人对此都有特定的解决方案,除了用选项卡式视图或其他东西覆盖两个 NSTableView。

【问题讨论】:

  • 不支持对两个表使用一个表视图。简单的解决方案:两个表视图并隐藏一个。 DIY 解决方案:自己保存和恢复列宽。

标签: macos nstableview


【解决方案1】:

我听从 Willeke 的建议,拯救并恢复了自己。

任何时候调整列的大小保存为自动保存名称

func tableViewColumnDidResize(_ notification: Notification) {
    guard let changedTableView = notification.object as? NSTableView, changedTableView == self.detailsTableView else {
        return
    }
    
    // Now save the table positions ourself !
    let columnWidths = changedTableView.tableColumns.reduce([String : CGFloat](), { dict, col in
        var dict = dict
        dict[col.identifier.rawValue] = col.width
        return dict
    } )
    
    if let tableViewName = changedTableView.autosaveName {
        Foundation.UserDefaults.standard.set(columnWidths, forKey: tableViewName)
    }
}

当用户选择查看另一个选项时,重新创建表格列并根据保存的值进行设置

func columnWidths(tableViewName: String) -> [String: CGFloat] {
    if let widths = Foundation.UserDefaults.standard.dictionary(forKey: tableViewName) as? [String: CGFloat] {
        return widths
    } else {
        return [:]
    }
}

func loadDetailTableData(index: Int){
    guard let detailTableView = self.detailsTableView else {
        return
    }
    
    // Clear the tableView
    for tableColumn in detailTableView.tableColumns {
        detailTableView.removeTableColumn(tableColumn)
    }
    
    switch index {
    case 0:
        self.detailTableViewSetup(detailTableView, autosaveName: self.userChangesAutosaveName, headers: self.changeColumnHeaders)
    case 1:
        self.detailTableViewSetup(detailTableView, autosaveName: self.loginSessionAutosaveName, headers: self.sessionColumnHeaders)
    default:
        break
    }

    detailTableView.reloadData()
    
}
func detailTableViewSetup(_ tableView: NSTableView, autosaveName: String, headers: [String]){
    
    tableView.autosaveName = nil
    
    let widths = self.columnWidths(tableViewName: autosaveName)
    
    var columnNo: Int = 0
    for column in headers {
        let id = columnNo.toString
        let tableColumn = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: id))
        tableColumn.title = column
        if let w = widths[id] {
            tableColumn.width = w
        }
        tableView.addTableColumn(tableColumn)
        columnNo += 1
    }
    tableView.autosaveName = autosaveName
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多