0
votes

I have an NSTableView whose data source is an NSMutableArray. The count of the array is returned in the numberOfRowsInTableView: method.

The table is refreshed by make a selection in other components such as an NSPopupButton, which changes the content of the array and performs the reloadData method.

The problem is that sometimes I am getting kind of data being written all over each other. So for example if the count is 4 and then after an action is performed it is 10, the additional 6 records are written below the first 4. It is only after I manually scroll the table up and down that the data (correct data) is displayed.

The console displays a message that

-[NSCFArray objectAtIndex:]: index(-1(or possibly larger)) beyond bounds (1056). 

I understand that the error message seems to point out that it is an array beyond bounds, however how can that be when I am only returning, say [array objectAtIndex: rowIndex] in the

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

method?

Also, the count return is returned in the numberOfRowsInTableView is always being correct (I know this since I am logging the count using a timer every few seconds).

Any ideas? Thanks!

Edit 1: I am returning the data as follows:

pc = [[PrinterClass alloc]init];
pc = [ads_printers_array objectAtIndex:rowIndex];       

            if (aTableColumn == tc_make)    
                return [pc make];

            if (aTableColumn == tc_model)           
                return [pc model];

            if (aTableColumn == tc_driver_name)         
                return [pc ppd];

            if (aTableColumn == tc_rdp_driver)      
            {
                if ([pc decider] == 1)
                    return [pc rdp];

                else return [pc model]; 
            }

The array that I mention above is filled with object of a class that I created called PrintersClass.

To reload the data, it's just reload data as usual:

[ads_rdp_driver_table reloadData];  

With ads_rdp_driver_table being the tableView name.

The thing is that this problem is coming up at random intervals at not at specific points. That is why I can't put my finger on it..

1
It would be great if you could post more code, in particular where you call reloadData and the numberOfRowsInSection and cellForRowAtIndexPath methodsPeter Kelly
Why not set a breakpoint on Objective-C exceptions, and when you get that array-out-of-bounds message, print out the index and the array count?paulmelnikow
pc = [[PrinterClass alloc] init]; followed by pc = [ads_printers_array objectAtIndex:rowIndex] does not make sense. I suggest deleting the first line, which does not do anything useful.paulmelnikow
It might help to post some more of your controller code. -numberOfRowsInTableView, the full body of -tableView:objectValueForTableColumn:.paulmelnikow
Finally, I don't understand what this means: "So for example if the count is 4 and then after an action is performed it is 10, the additional 6 records are written below the first 4." That sounds like the correct behavior.paulmelnikow

1 Answers

0
votes

Are you 100% sure you have connected the delegate and datasource ?

You can also do this in code

ads_rdp_driver_table.datasource = self;
ads_rdp_driver_table.delegate = self;

add this is in f.ex. awake from nib.

You also have to connect the tableview itself to an iboutlet, otherwise you can not call it by name.