Динамически скрывать столбцы в NSTableView - PullRequest
2 голосов
/ 16 сентября 2008

Я хочу динамически скрывать / показывать некоторые столбцы в NSTableView, основываясь на данных, которые будут отображаться - в основном, если столбец пуст, я бы хотел, чтобы столбец был скрыт. В настоящее время я заполняю таблицу классом контроллера в качестве делегата для таблицы.

Есть идеи? Я вижу, что я могу установить столбец скрытым в Интерфейсном Разработчике, однако, по-видимому, сейчас не время просматривать столбцы и проверять, являются ли они пустыми или нет, поскольку, похоже, нет метода, который вызывается до / после заполнения всех данных в таблице.

Ответы [ 8 ]

12 голосов
/ 29 февраля 2012

В Mac OS X v10.5 и новее есть селектор setHidden: для NSTableColumn.

Это позволяет динамически скрывать / показывать столбцы с использованием идентификаторов:

NSInteger colIdx;
NSTableColumn* col;

colIdx = [myTable columnWithIdentifier:@"columnIdent"];
col = [myTable.tableColumns objectAtIndex:colIdx];
[col setHidden:YES];
3 голосов
/ 16 сентября 2008

Я сделал это с привязками, но настраивал их программно, а не через Interface Builder.

Этот псевдо-фрагмент должен дать вам суть этого:

NSTableColumn *aColumn = [[NSTableColumn alloc] initWithIdentifier:attr];
[aColumn setWidth:DEFAULTCOLWIDTH];
[aColumn setMinWidth:MINCOLWIDTH];
[[aColumn headerCell] setStringValue:columnLabel];

[aColumn bind:@"value"
     toObject:arrayController 
  withKeyPath:keyPath 
  options:nil];             

[tableView addTableColumn:aColumn];
[aColumn release];

Конечно, вы можете добавить форматеры и все такое.

2 голосов
/ 09 октября 2015

Не работает в Интерфейсном Разработчике. Однако это работает программно. Вот как я связываю NSTableViewColumn с идентификатором «Status» с ключом в моем NSUserDefaults:

Swift:

tableView.tableColumnWithIdentifier("Status")?.bind("hidden", toObject: NSUserDefaults.standardUserDefaults(), withKeyPath: "TableColumnStatus", options: nil)

Objective-C:

[[self.tableView tableColumnWithIdentifier:@"Status"] bind:@"hidden" toObject:[NSUserDefaults standardUserDefaults] withKeyPath:@"TableColumnStatus" options:nil];
1 голос
/ 16 сентября 2008

У меня пока нет полного ответа, но загляни в Привязки. Как правило, с помощью привязок какао можно делать все что угодно.

Нет привязки Visibility для NSTableColumn, но вы можете установить ширину в 0.

Затем вы можете привязать его к пустому заполнителю и установить для этого значения значение 0, но не забудьте установить для других заполнителей разумные значения.

(Как я уже сказал, это только начало, может потребоваться некоторая настройка).

0 голосов
/ 02 ноября 2018

Я хотел бы опубликовать свое решение, обновленное для Swift 4, используя привязки Какао и фактический флаг isHidden, не затрагивая ширину столбцов (так как вам может потребоваться восстановить исходное значение впоследствии ...). Предположим, у нас есть флажок для переключения видимости некоторых столбцов (или вы всегда можете переключить переменную hideColumnsFlag в приведенном ниже примере любым другим способом, который вам нравится):

class ViewController: NSViewController {

     // define the boolean binding variable to hide the columns and use its name as keypath
     @objc dynamic var hideColumnsFlag = true

     // Referring the column(s)
     // Method 1: creating IBOutlet(s) for the column(s): just ctrl-drag each column here to add it
     @IBOutlet weak var hideableTableColumn: NSTableColumn!
     // add as many column outlets as you need...

     // or, if you prefer working with columns' string keypaths
     // Method 2: use just the table view IBOutlet and its column identifiers (you **must** anyway set the latter identifiers manually via IB for each column)
     @IBOutlet weak var theTableView: NSTableView! // this line could be actually removed if using the first method on this example, but in a real case, you will probably need it anyway.

     // MARK: View Controller Lifecycle

     override func viewDidLoad() {
         super.viewDidLoad()

         // Method 1
         // referring the columns by using the outlets as such:
         hideableTableColumn.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column outlet.

         // Method 2
         // or if you need/prefer to use the column identifiers strings then:
         // theTableView.tableColumn(withIdentifier: .init("columnName"))?.bind(.hidden, to: self, withKeyPath: "hideColumnsFlag", options: nil)
         // repeat for each column identifier you have set.

         // obviously use just one method by commenting/uncommenting one or the other.
     }

     // MARK: Actions

     // this is the checkBox action method, just toggling the boolean variable bound to the columns in the viewDidLoad method.
     @IBAction func hideColumnsCheckboxAction(_ sender: NSButton) {
         hideColumnsFlag = sender.state == .on
     }
}

Как вы, возможно, заметили, пока нет способа привязать флаг Hidden в Интерфейсном Разработчике, как на XCode10: вы можете видеть привязки Enabled или Editable, но только программно вы будете иметь доступ к isHidden флаг для столбца, как он называется в Swift.

Как отмечалось в комментариях, второй метод основан на идентификаторах столбцов, которые необходимо вручную установить либо через Интерфейсный Разработчик в поле Identity после выбора соответствующих столбцов, либо, если у вас есть массив имен столбцов, вы можете перечислять столбцы таблицы. и назначьте идентификаторы, а также привязки вместо повторения похожих строк кода.

0 голосов
/ 30 сентября 2008

NSTable - это просто класс, рисующий таблицу. Как вы сами сказали, у вас есть некоторый класс, который вы передаете в качестве делегата для таблицы, и этот класс снабжает таблицу данными для отображения. Если вы храните данные таблицы как NSArray в пределах вашего класса делегата, должно быть легко узнать, является ли один столбец пустым, не так ли? И NSArray спрашивает ваш класс с помощью метода делегата, сколько существует столбцов, поэтому, когда вас спрашивают, почему бы не посмотреть, сколько столбцов у вас есть, и сообщить это число вместо реального числа столбцов, которые вы храните внутри, а затем при запросе предоставляя данные для (столбец, строка), просто пропустите пустой столбец.

0 голосов
/ 18 сентября 2008

@ amrox - Если я правильно понимаю ваше предложение, вы говорите, что я должен привязать значение к скрытому свойству NSTableColumns в моей таблице? Кажется, что это будет работать, однако я не думаю, что NSTableColumn имеет скрытое свойство, поскольку сообщения isHidden и setHidden управляют видимостью столбца - что говорит мне, что это не свойство, если я что-то не пропустил (что вполне возможно).

0 голосов
/ 16 сентября 2008

Нет единого времени, когда все данные заполняются. NSTableView не хранит данные, он динамически запрашивает их у своего источника данных (или связанных объектов, если вы используете привязки). Он просто рисует, используя данные, полученные из источника данных, и отбрасывает его. Вы не должны видеть в таблице запрос данных для чего-то, что не видно, например.

Похоже, вы используете источник данных? Когда данные изменяются, вы обязаны вызывать -reloadData для таблицы, что немного ошибочно. Это больше похоже на «опровергнуть все».

То есть вы уже должны знать, когда изменяются данные. В этот момент вы можете вычислить, какие столбцы должны быть скрыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...