2011-01-10 7 views
3

シンプルなToDoリストアプリケーションでNSMutableArrayをNSTableViewコントローラで使用しようとすると問題が発生します。アイテムを追加しても機能しないので、アイテムを削除しようとするとエラー-[NSCFArray removeObjectAtIndex:]: index (0) beyond bounds (0)が表示されます。アイテムを追加しようとするとエラーが返されず、削除する際のエラーが明白な解決策にならないため、私の問題の原因を見つけることができないようです。私のコードは次の通りである:NSTableView(Cocoa)でNSMutableArrayを使用する際に問題が発生する

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 

私はまた、最初の文字列は、私はディスプレイの配列を初期化することに注意する必要がありますが、私はそれを削除することはできません新しい文字列を追加することができます。

+0

呼び出しコードを表示します。テーブルビューをそれに平行して更新しますか? – Eiko

答えて

3

根本的な問題はわかりませんが、最初に表示されるのは、基本アレイから行を削除/追加していますが、このことについてはテーブルを教えていないことです。 addToDoremoveToDoclearAllToDosから[tableView reloadData]に電話してください。

[NSMutableArray arrayWithObject;...]コールは、後でretainと呼び出しても問題ありません。

+0

ありがとう、私はこの時点までにスタティックテーブルでしか作業していなかったので、私はこれをしなければならないのか分からなかった。 – rpowell

0

AppController.mでは、配列 arrayWithObject: を作成しています。これにより、何かの後にリリースされるオートリリース配列が作成されます。代わりにinitWithObjects:メソッドを使用してください

+0

Xcodeは 'initWithObject:'のようなメソッドはないと私に伝えています。 – rpowell

+0

いいえ、彼は保留を送信します。 – Eiko

+0

NSArray * temp = [[NSArray alloc] initWithObjects:object、nil];私はObjectの後ろに 's'を書くのを忘れてしまって非常に残念です。 – Robin

2

私はあなたのコードをチェックしました。そして、toDoList = [[NSMutableArray arrayWithObject:@"Add a ToDo with the '+' button"] retain];[toDoList removeObjectAtIndex:[tableView selectedRow]];がうまくいっているようです。
あなたの問題に対する私の認識は、テーブルビューに関するものです。テーブルビューには常に選択項目が含まれていることを確認してください。これはInterface Builderで、またはプログラムで設定できます。これは、[toDoList removeObjectAtIndex:が常にテーブルビューから値を受け取ることを確認するためです。

+0

はい、選択がない場合、-selectedRowは-1を返します。 – JeremyP