Возникают проблемы при использовании NSMutableArray с NSTableView (Какао) - PullRequest
3 голосов
/ 10 января 2011

У меня возникла проблема при попытке использовать NSMutableArray с контроллером NSTableView в моем простом приложении со списком задач. Добавление элементов не работает, а попытка удаления элементов выдает ошибку -[NSCFArray removeObjectAtIndex:]: index (0) beyond bounds (0). Кажется, я не могу найти причину моей проблемы, поскольку попытка добавить элемент не возвращает ошибку, а ошибка в удалении одного не приводит к очевидному решению. Мой код выглядит следующим образом:

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

Следует также отметить, что в исходной строке я инициализирую массив отображениями, но не могу удалить его или добавить новые строки.

Ответы [ 3 ]

3 голосов
/ 10 января 2011

Не уверен в основной проблеме, но первое, что я вижу, это то, что вы удаляете / добавляете строки из базового массива, но не говорите об этом таблице. Убедитесь, что вы звоните [tableView reloadData] из addToDo, removeToDo и clearAllToDos.

Вызов [NSMutableArray arrayWithObject;...] в порядке, так как впоследствии вы также звоните retain.

2 голосов
/ 10 января 2011

Я проверил ваш код. И кажется, что toDoList = [[NSMutableArray arrayWithObject:@"Add a ToDo with the '+' button"] retain]; и [toDoList removeObjectAtIndex:[tableView selectedRow]]; преуспевают.
Мое восприятие вашей проблемы связано с представлением таблицы. Убедитесь, что ваш табличный вид всегда содержит выбор. Вы можете установить это в Интерфейсном Разработчике или программно. Это сделано для того, чтобы [toDoList removeObjectAtIndex: всегда получал значение из табличного представления.

0 голосов
/ 10 января 2011

В AppController.m вы создаете массив методом arrayWithObject: это создаст массив автоматического выпуска, который будет выпущен после чего-то. поэтому вместо этого используйте initWithObjects: метод

...