簡體   English   中英

無法在禁用的 NSTableView 中禁用復選框(NSButton)

[英]Unable to disable Checkbox (NSButton) inside a disabled NSTableView

我有一個應用程序,其中包含一個具有 2 列的NSTableView實例。 一列是這樣的一個實例:

#import <Cocoa/Cocoa.h>
@class NSTableView;
@interface MMCheckboxTableCellView : NSTableCellView
@property (weak) IBOutlet NSButton *checkboxField;
@end

並且實現都是樣板文件,根本沒有添加自定義代碼。 在代碼中,NSTableView 實例根據應用程序的各種狀態以編程方式設置tableview.enabled = YES (或 NO)。 tableview被禁用時,表格的另一列(僅顯示)將停止響應單擊操作,正如預期的那樣。 上面的復選框列繼續響應點擊並讓用戶選中/取消選中按鈕實例。

為了嘗試解決這個問題,我在復選框列中添加了一個文本字段(它沒有連接到任何東西),當 tableview 被禁用時,不可能在該字段中輸入文本。 NSButton 有什么特別之處我錯過了嗎? 是否有可能因為我從 NSTableCellView 派生了這個類並添加了復選框而不是使用復選框單元格,所以我遇到了這個問題?

我終於想通了這一點。 看起來即使 NSButton 嵌入在 NSTableView 中,在表上設置 enabled=NO 也不能控制按鈕的行為。 最終完成這項工作的唯一方法是根據應用程序的狀態調用 setEnabled 控件。 這必須發生在單元格的渲染中,因此當狀態發生變化時,還需要調用 NSTableView:reloadData 以便可見單元格立即重繪。

作為替代方案,我決定通過設置一個與返回空白或復選標記字符 (✓) 的布爾屬性匹配的計算屬性來解決同樣的問題。 然后綁定到此字段作為啟用/禁用工作的正常 NSTextfield。

    // Swift 
    // Computed variables on model for readonly display in table
    var bIosText:String     {return bIos ? "✓" : " " }
    var bAndroidText:String {return bAndroid ? "✓" : " " }

我覺得挺好看的:

在此處輸入圖片說明

當然這只是解決方案的一部分,如果要啟用編輯,則需要有多個列並根據需要隱藏/取消隱藏。

不要在表格視圖中嵌入NSButton ,只使用NSButtonCell 如果您的NSTableView是基於視圖的,它將切換到基於單元格的(至少 Xcode 為我做到了)。

所以這是錯誤的

基於視圖,使用 NSButton

這是正確的

基於細胞

在此更改后禁用/啟用表格視圖就足夠了,按鈕單元將相應地表現。

暫無
暫無

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

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