[Obj-C/Cocoa] Uitlezen NSArray in aparte class

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • vgroenewold
  • Registratie: Augustus 2005
  • Laatst online: 18-09 17:09
Beste mensen,

Ik heb een ontzettend beginners-probleem, heb wel ervaring maar zie iets super-basics over het hoofd. Ik heb een AppController class welke een aparte class gebruikt om een NSArray te vullen met data. Dus:

De header file van AppController:
code:
1
2
3
4
5
6
7
8
9
10
11
#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    IBOutlet NSTextField *textField;
    IBOutlet NSTableView *tableView;
    NSSpeechSynthesizer *speechSynthesizer;
    NSArray *Voices;
}
- (IBAction)startSpeaking:(id)sender;

@end


En de implementatie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#import "AppController.h"
#import "SpeechList.h"

@implementation AppController

- (void)awakeFromNib

{
    speechSynthesizer  = [[NSSpeechSynthesizer alloc] init];

    /* Make the Window object the responder to NSSpeechSynthesizer delegate methods */
    
    [speechSynthesizer setDelegate:self];
    Voices = [[SpeechList alloc] init];
}

#pragma mark Action methods

- (IBAction)startSpeaking:(id)sender {
    NSString *speechText = [textField stringValue];

    [speechSynthesizer setVoice:NULL];
    [speechSynthesizer startSpeakingString:speechText];
}

#pragma mark Datasource methods

- (int)numberOfRowsInTableView:(NSTableView *)tv
{
    return [Voices count];
}

- (id)tableView:(NSTableView *)tv
                objectValueForTableColumn:(NSTableColumn *)tableColumn
                row:(int)row
{
    NSString *voice = [Voices objectAtIndex:row];
    return voice;
}

#pragma mark Dealloc

-(void)dealloc {
    [Voices release];
    Voices = nil;
    [super dealloc];
}

@end


De aparte class file is zeer simpel en bevat de volgende header:

code:
1
2
3
4
5
6
7
8
9
#import <Cocoa/Cocoa.h>

@interface SpeechList : NSObject {
    NSArray *speechList;
}

@property(readonly, assign) NSArray *speechList;

@end


En implementatie file:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "SpeechList.h"

@implementation SpeechList

- (id)init
{
    [super init];
    speechList = [NSSpeechSynthesizer availableVoices];

    return self;
}

@synthesize speechList;

@end


Probleem is nu dat ik een fatale fout krijg, waarbij de debugger tijdens runtime aangeeft dat het aanroepen van SpeechList count niet lukt omdat deze niet is gedefinieerd. Echter geeft SpeechList een Array terug waarbij de count functie gewoon zou moeten zitten, het lijk wel of ik dus iets anders terug krijg dan een Array of ik maak een flinke fout in het implementeren van een aparte class. Dit laatste zou mij veel leren, dus als jullie input hebben, graag!

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 03:04

Gerco

Professional Newbie

Als ik het goed zie is Voices nu helemaal geen instance van NSArray, maar van SpeechList en die heeft inderdaad geen count method. Als je de volgende regel aanpast zou het wel moeten werken:

Objective-C:
1
2
    SpeechList* temp = [[SpeechList alloc] init];
    Voices = temp.speechList;


Dan moet je nog wel even het probleem oplossen dat je op deze manier de reference naar de SpeechList instance verliest en dat de reference count op het NSArray object speechList niet meer correct is (iets met retain en release enzo).

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Je SpeechList class inherit van NSObject, en niet van NSArray en dus krijg je ook geen NSArray terug. Als je SpeechList wel laat inheriten van NSArray, of je gebruikt een member van SpeechList werkt het waarschijnlijk wel.

Edit:
/\ dat dus

[ Voor 4% gewijzigd door XiN-eViL op 23-11-2008 14:07 ]


Acties:
  • 0 Henk 'm!

  • vgroenewold
  • Registratie: Augustus 2005
  • Laatst online: 18-09 17:09
Gerco schreef op zondag 23 november 2008 @ 13:59:
Als ik het goed zie is Voices nu helemaal geen instance van NSArray, maar van SpeechList en die heeft inderdaad geen count method. Als je de volgende regel aanpast zou het wel moeten werken:

Objective-C:
1
2
    SpeechList* temp = [[SpeechList alloc] init];
    Voices = temp.speechList;


Dan moet je nog wel even het probleem oplossen dat je op deze manier de reference naar de SpeechList instance verliest en dat de reference count op het NSArray object speechList niet meer correct is (iets met retain en release enzo).
Ach, bedankt! Klopt inderdaad en ik heb het zelf al eens deels aangepakt door zelf een count method in SpeechList te zetten, dat werkte maar was natruurlijk weer niet de bedoeling... had ik zelf de conclusie wel moeten trekken natuurlijk. :) Ik leer als een trein, maar dit soort dingen gooien me soms weer even lekker terug.