作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法从 cocoa 编程书中找到一个可以工作的示例(我认为部分问题是 XCode 已经过时了)。除了在 IB 中建立适当的连接之外,它没有提到我必须做的任何特殊事情才能接收来自 NSTableView 的通知。该应用程序是一个带有用于用户输入的 NSTextField 的程序,当单击按钮时,NSSpeechSynthesizer 的实例将说出输入的行。我应该能够通过选择表格 View 上的一行来切换说话的声音。我可以单击,该应用程序在技术上可以工作,但我无法通过单击 GUI 上 NSTableView 上的一行来更改默认语音:
appdelegate.h:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate,NSSpeechSynthesizerDelegate,NSTableViewDelegate>
{
NSArray *_voices;
NSSpeechSynthesizer *_speechSynth;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
@property (assign) IBOutlet NSTextField *text;
@property (assign) IBOutlet NSButton *_speakButton;
@property (assign) IBOutlet NSButton *_stopButton;
@property (assign) IBOutlet NSTableView *table;
-(IBAction)sayIt:(id)sender;
-(IBAction)stopIt:(id)sender;
@end
appdelegate.m:
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize textField = _textField;
@synthesize text = _text;
@synthesize _speakButton;
@synthesize _stopButton;
@synthesize table;
-(void)speechSynthesizer:(NSSpeechSynthesizer *)sender didFinishSpeaking:(BOOL)finishedSpeaking
{
NSLog(@"finishedSpeaking=%d",finishedSpeaking);
[_speakButton setEnabled:YES];
[_stopButton setEnabled:NO];
[table setEnabled:YES];
}
-(id)init
{
NSLog(@"init called");
self = [super init];
if (self)
{
NSLog(@"init");
_speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
[_speechSynth setDelegate:self];
[_text setStringValue:@""];
_voices = [NSSpeechSynthesizer availableVoices];
}
//I added this line myself as I was trying to figure it out
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableViewSelectionDidChange:) name:@"MyNotification" object:table];
return self;
}
-(IBAction)sayIt:(id)sender
{
NSString *string = [_textField stringValue];
if([string length]==0)
{
NSLog(@"string from %@ is of zero-length",_textField);
return;
}
[_speechSynth startSpeakingString:string];
[_text setStringValue:[_speechSynth voice]];
...
}
-(IBAction)stopIt:(id)sender
{
NSLog(@"stopping");
...
}
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tv
{
return (NSInteger)[_voices count];
}
-(id)tableView:(NSTableView *)tv
objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSString *v = [_voices objectAtIndex:row];
NSDictionary *dict =[NSSpeechSynthesizer attributesForVoice:v];
return [dict objectForKey:NSVoiceName];
}
-(void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger row = [table selectedRow];
if(row==-1) return;
NSString *selectedVoice = [_voices objectAtIndex:row];
[_speechSynth setVoice:selectedVoice];
NSLog(@"new voice = %@",selectedVoice);
}
-(void)awakeFromNib
{
NSLog(@"awakeFromNib");
NSString *defaultVoice = [NSSpeechSynthesizer defaultVoice];
NSInteger defaultRow = [_voices indexOfObject:defaultVoice];
NSIndexSet *indices = [NSIndexSet indexSetWithIndex:defaultRow];
[table selectRowIndexes:indices byExtendingSelection:NO];
[table scrollRowToVisible:defaultRow];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"Appdidfinishlaunching called");
}
@end
我猜我的做法是错误的。我只需要有人为我指明正确的方向,让我明白这应该如何运作。
最佳答案
这里有几个可能的错误来源。
您可能忘记将 Nib 中的表格 View 作为其委托(delegate)
挂接到应用委托(delegate)。
您可能忘记将 Nib 中的应用委托(delegate)作为其 textField
挂接到文本字段。
(还有其他可能性(与将东西连接到 Nib 有关),但我不会列出所有这些......)
如果您的目标确实是获取选择消息作为通知,那么此行是错误的:
[[NSNotificationCenter defaultCenter]
addObserver:self selector:@selector(tableViewSelectionDidChange:)
name:@"MyNotification" object:table];
此通知的名称不是@"MyNotification"
;它是NSTableViewSelectionDidChangeNotification
。
关于Objective-C/Cocoa/XCode 新手 : How to receive Notifications?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16023827/
我是一名优秀的程序员,十分优秀!