我的应用程序包含一个PLAY / PAUSE按钮,设置为在Interface Builder中键入 Toggle 。我用它 - 正如名字所示 - 来播放我的资产或暂停它们
此外,我正在侦听SPACE键以通过键盘快捷键启用相同的功能。因此,我在我的应用程序中使用keyDown:
中的NSResponder
。这是在另一个子视图中完成的。此时按钮本身不可见
我将当前播放状态存储在Singleton中。
如果考虑到其状态可能已被键盘快捷键更改,您如何更新toogle按钮的标题/替代标题?我可以使用绑定吗?
答案 0 :(得分:2)
我设法按如下方式实现按钮标题的连续更新。我为状态添加了一个程序化绑定(在示例buttonTitle
中)。请注意,IBAction
toggleButtonTitle:
不会直接更改按钮标题!相反,updateButtonTitle
方法负责此任务。自调用self.setButtonTitle
以来,上述绑定立即更新
以下示例显示了我尝试描述的内容。
// BindThisAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface BindThisAppDelegate : NSObject<NSApplicationDelegate> {
NSWindow* m_window;
NSButton* m_button;
NSString* m_buttonTitle;
NSUInteger m_hitCount;
}
@property (readwrite, assign) IBOutlet NSWindow* window;
@property (readwrite, assign) IBOutlet NSButton* button;
@property (readwrite, assign) NSString* buttonTitle;
- (IBAction)toggleButtonTitle:(id)sender;
@end
执行文件:
// BindThisAppDelegate.m
#import "BindThisAppDelegate.h"
@interface BindThisAppDelegate()
- (void)updateButtonTitle;
@end
@implementation BindThisAppDelegate
- (id)init {
self = [super init];
if (self) {
m_hitCount = 0;
[self updateButtonTitle];
}
return self;
}
@synthesize window = m_window;
@synthesize button = m_button;
@synthesize buttonTitle = m_buttonTitle;
- (void)applicationDidFinishLaunching:(NSNotification*)notification {
[self.button bind:@"title" toObject:self withKeyPath:@"buttonTitle" options:nil];
}
- (IBAction)toggleButtonTitle:(id)sender {
m_hitCount++;
[self updateButtonTitle];
}
- (void)updateButtonTitle {
self.buttonTitle = (m_hitCount % 2 == 0) ? @"Even" : @"Uneven";
}
@end
如果您将状态存储在枚举或整数中,则自定义NSValueTransformer
将帮助您将状态转换为其等效的按钮标题。您可以将NSValueTransformer
添加到绑定选项。
NSDictionary* options = [NSDictionary dictionaryWithObject:[[CustomValueTransformer alloc] init] forKey:NSValueTransformerBindingOption];
[self.button bind:@"title" toObject:self withKeyPath:@"buttonTitle" options:options];