Звучит так, как будто у вас есть несколько вариантов.
Этот первый вариант немного сложнее, чем другие, но все же полезно знать о нем. Эта опция в основном не будет использовать привязки для кнопки закрытия / повторного открытия, а вместо этого будет устанавливать заголовок и т. Д. Программно. Основной план игры будет следующим:
Первоначальный заголовок кнопки закрытия / повторного открытия при открытии документа задается в файле пера (например, Close
).
При желании, когда документ открывается, вы можете отключить кнопку в -awakeFromNib
, так как представление таблицы не будет иметь начального выбора.
Единственные действия, которые требуют изменения заголовка или включенного состояния кнопки, это 1) когда изменяется выбор таблицы и 2) когда вы нажимаете кнопку закрытия / повторного открытия, чтобы переключить случай состояние.
Чтобы достичь желаемого результата, вы должны создать IBOutlet
для кнопки закрытия / повторного открытия, если у вас ее еще нет. Затем вы подключите выход delegate
таблицы просмотра к вашему классу контроллера, который сообщит вашему классу контроллера об изменении выбора таблицы (с помощью метода протокола - (void)tableViewSelectionDidChange:(NSNotification *)notification
<NSTableViewDelegate>
). Вам также необходимо обновить метод close / reopen IBAction
, чтобы убедиться, что он переключает заголовок кнопки после нажатия (так как выбор таблицы не изменился во время этой операции). Код класса контроллера может выглядеть примерно так:
// add this declaration to avoid compiler warnings:
@interface LHController (LHPrivate)
- (void)updateCloseReopenButtonTitle;
@end
- (void)awakeFromNib {
[self updateCloseReopenButtonTitle];
}
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
[self updateCloseReopenButtonTitle];
}
- (IBAction)toggleCloseReopenButton:(id)sender {
// do your existing code here and then add:
[self updateCloseReopenButtonTitle];
}
- (void)updateCloseReopenButtonTitle {
// assuming 'casesController' is an IBOutlet to your NSArrayController
NSArray *selectedObjects = [casesController selectedObjects];
// loop through the selected cases to determine whether
// they're all closed, all open, or mixed to set
// the title of the button appropriately
BOOL allClosed = YES;
for (LHCase *case in selectedCases) {
if ([case isOpen]) {
allClosed = NO;
break;
}
}
[closeReopenButton setTitle:(allClosed ? @"Reopen" : @"Close")];
[closeReopenButton setEnabled:[selectedObjects count] > 0];
}
До того, как появились привязки, так мы привыкли делать вещи.
Другим вариантом может быть пересмотр вашего пользовательского интерфейса: возможно, вместо кнопки переключения / переключения, название которой нужно переключать, вместо этого можно просто установить флажок под названием Closed
, который будет обозначать, были ли закрыты выбранные случаи или нет. , Вы можете использовать привязки для состояния флажка, как показано на рисунке ниже:
![enter image description here](https://i.stack.imgur.com/c7JDM.png)
Тогда у вас может быть метод IBAction
, который обрабатывает дополнительные вещи, которые требуют обработки. Вы можете спросить casesController
о -selectedObjects
и затем просмотреть их. Пока вы убедитесь, что флажок Allows Mixed
указывает, он имеет дополнительное преимущество, заключающееся в лучшем представлении смешанных сценариев, в случае выбора случаев со смешанными открытыми / закрытыми состояниями (флажок тире вместо полной проверки) .
Другой вариант, если вы хотите придерживаться переключателя, - создать и указать custom NSValueTransformer
для заголовка и альтернативных привязок заголовка. Этот преобразователь значений принимает булево закрытое / открытое состояние корпуса и превращает его в строку, более подходящую, чем просто 0 или 1 (что сейчас и отображается). Это может выглядеть примерно так:
+ (Class)transformedValueClass {
return [NSString class];
}
+ (BOOL)allowsReverseTransformation {
return NO;
}
- (id)transformedValue:(id)value {
BOOL isClosed;
if (value == nil) return nil;
// Attempt to get a reasonable value from the
// value object.
if ([value respondsToSelector: @selector(boolValue)]) {
isClosed = [value boolValue];
} else {
[NSException raise: NSInternalInconsistencyException
format: @"Value (%@) does not respond to -boolValue.",
[value class]];
}
return (isClosed ? @"Reopen" : @"Close");
}