2011-01-10 3 views
3

Ich habe ein Problem, ein NSMutableArray mit einem NSTableView-Controller in meiner einfachen ToDo-Liste Anwendung zu verwenden. Hinzufügen von Elementen funktioniert nicht und versuchen, Elemente zu löschen gibt mir den Fehler -[NSCFArray removeObjectAtIndex:]: index (0) beyond bounds (0). Ich kann nicht die Ursache meines Problems finden, da der Versuch, ein Element hinzuzufügen, keinen Fehler zurückgibt und der Fehler beim Entfernen eines Elements zu keiner offensichtlichen Lösung führt. Mein Code ist wie folgt:Probleme mit NSMutableArray mit NSTableView (Cocoa)

AppController.h

// 
// AppController.h 
// ToDo 
// 
// Created by Rhys Powell on 10/01/11. 
// 

#import <Cocoa/Cocoa.h> 
#import <BWToolkitFramework/BWToolkitFramework.h> 

@interface AppController : NSObject { 
    IBOutlet BWAnchoredButton *addButton; 
    IBOutlet BWAnchoredButton *removeButton; 
    IBOutlet NSMenuItem *clearAll; 
    IBOutlet NSTableView *tableView; 
    NSMutableArray *toDoList; 
} 
- (IBAction)addToDo:(id)sender; 
- (IBAction)removeToDo:(id)sender; 
- (IBAction)clearAllToDos:(id)sender; 
@end 

AppController.m

// 
// AppController.m 
// ToDo 
// 
// Created by Rhys Powell on 10/01/11. 
// 

#import "AppController.h" 


@implementation AppController 

- (id)init 
{ 
    [super init]; 

    NSLog(@"Initialising..."); 

    toDoList = [[NSMutableArray arrayWithObject:@"Add a ToDo with the '+' button"] retain]; 

    return self; 
} 

- (IBAction)addToDo:(id)sender 
{ 
    NSLog(@"Added a ToDo"); 
    [toDoList addObject:@"Test"]; 
} 

- (IBAction)removeToDo:(id)sender 
{ 
    [toDoList removeObjectAtIndex:[tableView selectedRow]]; 
} 

- (IBAction)clearAllToDos:(id)sender 
{ 
    [toDoList removeAllObjects]; 
} 

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

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

@end 

Ich sollte auch beachten, dass die ursprüngliche Zeichenfolge ich das Array mit Displays zu initialisieren, aber ich kann es nicht löschen oder füge neue Zeichenfolgen hinzu.

+0

Den Anrufcode anzeigen. Aktualisieren Sie die Tabellenansicht parallel dazu? – Eiko

Antwort

3

Nicht sicher über das zugrunde liegende Problem, aber die erste Sache, die ich sehe, ist das Löschen/Hinzufügen der Zeilen aus dem zugrunde liegenden Array, aber die Tabelle nicht darüber zu erzählen. Stellen Sie sicher, dass Sie [tableView reloadData] innerhalb von addToDo, removeToDo und clearAllToDos anrufen.

Der Anruf [NSMutableArray arrayWithObject;...] ist in Ordnung, wie Sie auch später retain anrufen.

+0

Vielen Dank, ich hatte vorher nur mit statischen Tabellen gearbeitet, also wusste ich nicht, dass ich das tun musste. – rpowell

0

In AppController.m erstellen Sie das Array mit der Methode arrayWithObject: Dies wird ein Autorelease-Array erstellen, die nach etwas freigegeben wird. so verwenden Sie stattdessen initWithObjects: Methode

+0

Xcode sagt mir, dass es keine solche Methode wie 'initWithObject:' gibt. – rpowell

+0

Nein, er sendet einen behalten. – Eiko

+0

NSArray * temp = [[NSArray alloc] initWithObjects: object, nil]; Es tut mir sehr leid, dass ich vergessen habe, 's' nach Object zu schreiben. – Robin

2

Ich habe Sie Code überprüft. Und es scheint, dass die toDoList = [[NSMutableArray arrayWithObject:@"Add a ToDo with the '+' button"] retain]; und die [toDoList removeObjectAtIndex:[tableView selectedRow]]; gut sind.
Meine Wahrnehmung Ihres Problems ist in Bezug auf die Tabellenansicht. Stellen Sie sicher, dass Ihre Tabellenansicht immer eine Auswahl enthält. Sie können dies im Interface Builder oder programmgesteuert einrichten. Dies stellt sicher, dass [toDoList removeObjectAtIndex: immer einen Wert aus der Tabellenansicht erhält.

+0

Ja, wenn keine Auswahl vorhanden ist, gibt -selectedRow -1 zurück. – JeremyP