簡體   English   中英

雙擊可可時如何自動調整表格列的大小?

[英]How to auto resize table column when double clicking on Cocoa?

我想在雙擊表頭(顯示調整大小光標)時將表列自動調整為其內容寬度,就像在 iTunes 上一樣。

有人知道怎么做嗎?

提前致謝

查看NSTableView方法setDoubleAction: 您也可以從 Interface Builder 進行設置 - 我沒有檢查。 文檔中:

設置雙重動作:

設置當用戶雙擊給定選擇器的不可編輯單元格或列標題時發送到目標的消息。

 - (void)setDoubleAction:(SEL)aSelector

參數
選擇器
當用戶雙擊不可編輯的單元格或列標題時接收器發送到其目標的消息。

討論
如果雙擊的單元格是可編輯的,則不會發送此消息,而是編輯單元格。 您可以使用此方法實現根據雙擊的列對記錄進行排序等功能。 另請參閱clickedRow ,您可以使用它來確定是否單擊了行而不是列標題。

要使方法生效,必須將接收者的動作和目標設置為聲明選擇器的類。 有關操作消息的更多信息,請參閱操作消息。

如果您使用基於視圖的表格視圖並針對 macOS 10.6 或更高版本,則可以實現 NSTableViewDelegate 方法tableView(_:sizeToFitWidthOfColumn:)

這是我做的一個簡單的 Swift 實現,它被證明對於一個有 10 列和幾百行的表來說足夠快:

func tableView(_ tableView: NSTableView, sizeToFitWidthOfColumn column: Int) -> CGFloat {
    var longestWidth = 0.0
    var text: String

    for row in 0..<tableView.numberOfRows {
        let item = myDataSource[row]

        switch column {
            case 0: text = item.firstName
            case 1: text = item.middleName
            case 2: text = item.lastName
            case 3: text = item.streetNumber
            case 4: text = item.city
            case 5: text = item.region
            case 6: text = item.country
            case 7: text = item.bloodType
            case 8: text = item.gender
            case 9: text = item.nationality
            default: text = ""
        }

        let textSize = text.size(withAttributes: [
            // .regular requires macOS 10.12+
            .font: NSFont.systemFont(ofSize: NSFont.systemFontSize(for: .regular))
        ])

        if textSize.width > longestWidth {
            longestWidth = textSize.width
        }
    }

    return longestWidth + 8 // some padding
}

如果它變慢了,你可能應該計算可見行的大小以及更多的上面和下面的行,或者找到一個更好的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM