4 berichten aan het bekijken - 1 tot 4 (van in totaal 4)
  • Q:
    Bijdrager
    cyberboy

    AddressBook

    ik ben bezig geweest met een klein programmaatje.
    Het maakt gebruik van de NSTableView, maar daar loopt het ook gelijk vast, tenminste dat idee heb ik.
    controller.h
    [code:1:bed6c921c5]
    /* Controller */

    #import <Cocoa/Cocoa.h>


    @interface
    Controller : NSObject
    {
    IBOutlet id emailField;
    IBOutlet id firstNameField;
    IBOutlet id homePhoneField;
    IBOutlet id lastNameField;
    IBOutlet id tableView;
    NSMutableArray *records;
    }
    – (IBAction)addRecord:(id)sender;
    – (IBAction)deleteRecord:(id)sender;
    – (IBAction)insertRecord:(id)sender;
    @end

    [/code:1:bed6c921c5]

    controller.m deels
    [code:1:bed6c921c5]

    -(IBAction)addRecord:(id)sender
    {

    [records addObject:[self createRecord]];
    [tableView reloadData];
    }

    -(NSDictionary *)createRecord
    {
    NSMutableDictionary *record = [NSMutableDictionary dictionary];

    [record setObject:[firstNameField stringValue] forKey:@"First Name"];
    [record setObject:[lastNameField stringValue] forKey:@"Last Name"];
    [record setObject:[emailField stringValue] forKey:@"Email"];
    [record setObject:[homePhoneField stringValue] forKey:@"Home Phone"];

    return record;
    }

    -(void)awakeFromNib
    {
    records = [[NSMutableArray alloc] init];
    }

    [/code:1:bed6c921c5]

    Het compilen gaat allemaal goed:)
    Maar dan…. als ik op Add druk gebeurt er helemaal niks!
    En dit geeft hij bij het opstarten

    [Session started at 2007-04-30 19:18:41 +0200.]
    2007-04-30 19:18:42.241 AddressBook[486] *** Illegal NSTableView data source (<Controller: 0x3141d0>). Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:

    Waarschijnlijk doe ik iets verkeerd met de NSTableView.
    Graag hulp.

    Alvast bedankt,

    Cyberboy

    Bijdrager
    rvamerongen

    Hoi

    Ieder NSTableView heeft een datasource nodig met enkele standaard methodes die door de NSTableView aangeroepen worden. Deze methodes gebruiken jouw records object(en) als data. Zonder dat geen data in de view!

    Aangezien je nog niets hier omtrend ingevoegd heb, is het nu belangrijk dat je de documentatie leest over NSTableView.

    Kijk in xcode bij help en type NSTableView
    kijk ook hier http://cocoadevcentral.com/articles/000063.php.

    succes

    RvA

    Inactief
    Anoniem

    Hier is die link zonder punt: http://cocoadevcentral.com/articles/000063.php :wink:

    Een alternatief voor een datasource is het gebruik van Cocoa Bindings, zie bijvoorbeeld hier.

    Bijdrager
    ridesmet

    Cyberboy,

    De verwijzingen die de anderen hier gepost hebben zijn interessant, maar ik denk dat je hiermee nog steeds geen concreet antwoord hebt om je probleem op te lossen.

    ”cyberboy”

    Maar dan…. als ik op Add druk gebeurt er helemaal niks!
    En dit geeft hij bij het opstarten

    [Session started at 2007-04-30 19:18:41 +0200.]
    2007-04-30 19:18:42.241 AddressBook[486] *** Illegal NSTableView data source (<Controller: 0x3141d0>). Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:

    Waarschijnlijk doe ik iets verkeerd met de NSTableView.

    Je doet eigenlijk niks verkeerd, je bent alleen nog een stuk vergeten implementeren, en de foutboodschap hierboven zegt je zelfs welke methodes je nog moest implementeren!:-)

    Eerst en vooral moet je NSTableView weten hoeveel rijen er in de tabel zullen moeten getoond worden. Dit zal overeenstemmen met het aantal elementen in je records array, dus:

    [code:1:8e02f9dc2f]
    – (int)numberOfRowsInTableView:(NSTableView *)aTableView
    {
    return [records count];
    }
    [/code:1:8e02f9dc2f]

    De tabel weet nu al hoeveel rijen er zullen zijn. Op basis daarvan weet de tabel hoeveel zichtbare rijen er zullen zijn (scrollbars!) en welke er op dat ogenblik zichtbaar zijn. Voor die zichtbare rijen en kolommen zal de NSTableView uw Controller object aansprken met de andere method die je moet implementeren:

    [code:1:8e02f9dc2f]
    – (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
    {
    NSDictionary *record = [records objectAtIndex: rowIndex];
    // Based on the column identifier, return the correct entry from the record
    return …
    }
    [/code:1:8e02f9dc2f]

    Dat zou het alvast moeten zijn om de informatie van al je records te kunnen aanbieden aan je NSTableView.

    Meer informatie over hoe een NSTableView communiceert met het object dat de achterliggende gegevens aanlevert vind je in de XCode documentatie van het Objective-C protocol NSTableDataSource.

    Naar de toekomst toe raad ik je, net als Koen, óók aan eens te kijken hoe Bindings werken. Dit scheelt een hoop codeer werk omdat je het koppelen van de NSTableView aan je records array volledig in Interface Builder kunt doen zonder 1 letter code te moeten schijven!

    Groeten,

    Ringo

4 berichten aan het bekijken - 1 tot 4 (van in totaal 4)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.