2010-05-25 32 views
-1

我一直在通過在這裏推薦的一本書中的練習在stackoverflow,但是我遇到了一個問題,並在三天的撞擊我的頭在牆上,我想我需要一些幫助。通過「可可編程爲Mac OS X」中的練習 - 我被難倒了

我正在通過「Speakline」練習,我們將TableView添加到界面,並且該表格將顯示可以爲程序的文本到語音方面選擇的「語音」。

我有兩個問題,我似乎無法到達的底部:

  1. 我得到以下錯誤:***非法NSTableView的數據源()。必須實現numberOfRowsInTableView:和的tableView:objectValueForTableColumn:行:
  2. 的的tableView是應該顯示的聲音出現空白

我有兩個問題是相關的感覺。

我包括我的界面代碼在這裏:這裏

#import <Cocoa/Cocoa.h> 


@interface AppController : NSObject <NSSpeechSynthesizerDelegate, NSTableViewDelegate> 
{ 
    IBOutlet NSTextField *textField; 
    NSSpeechSynthesizer *speechSynth; 
    IBOutlet NSButton *stopButton; 
    IBOutlet NSButton *startButton; 
    IBOutlet NSTableView *tableView; 
    NSArray *voiceList; 

} 

- (IBAction)sayIt:(id)sender; 
- (IBAction)stopIt:(id)sender; 

@end 

我的實現代碼:

#import "AppController.h" 


@implementation AppController 

- (id)init 
{ 
    [super init]; 

    //Log to help me understand what is happening 
    NSLog(@"init"); 

    speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil]; 
    [speechSynth setDelegate:self]; 
    voiceList = [[NSSpeechSynthesizer availableVoices] retain]; 
    return self; 
} 

- (IBAction)sayIt:(id)sender 
{ 

    NSString *string = [[textField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

    //Is the string zero-length? 
    if([string length] == 0) { 
     NSLog(@"String from %@ is a string with a length of %d.", textField, [string length]); 
     [speechSynth startSpeakingString:@"Please enter a phrase first."]; 
    } 
    [speechSynth startSpeakingString:string]; 
    NSLog(@"Started to say: %@", string); 
    [stopButton setEnabled:YES]; 
    [startButton setEnabled:NO]; 
} 

- (IBAction)stopIt:(id)sender 
{ 
    NSLog(@"Stopping..."); 
    [speechSynth stopSpeaking]; 
} 

- (void) speechSynthesizer:(NSSpeechSynthesizer *)sender didFinishSpeaking:(BOOL)complete 
{ 
    NSLog(@"Complete = %d", complete); 
    [stopButton setEnabled:NO]; 
    [startButton setEnabled:YES]; 
} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView 
{ 
    return [voiceList count]; 
} 

- (id)tableView: (NSTableView *)tv objecValueForTableColumn: (NSTableColumn *)tableColumn 
      row:(NSInteger)row 
{ 
    NSString *v = [voiceList objectAtIndex:row]; 
    NSLog(@"v = %@",v); 
    NSDictionary *dict = [NSSpeechSynthesizer attributesForVoice:v]; 
    return [dict objectForKey:NSVoiceName]; 
} 

/* 
- (BOOL)respondsToSelector:(SEL)aSelector 
{ 
    NSString *methodName = NSStringFromSelector(aSelector); 
    NSLog(@"respondsToSelector: %@", methodName); 
    return [super respondsToSelector:aSelector]; 
} 
*/ 

@end 

希望你們能看到的東西很明顯,我已經錯過了。

謝謝!

回答

3

objecValueForTableColumnobjectValueForTableColumn不一樣。當談到代表和數據源時,我建議不要輸入方法名稱,如果可以避免的話 - 它會導致這種問題。如果您複製&將方法簽名粘貼到文檔中,您可以更安全。祝你好運!