2010-07-12 47 views
7

Tôi đang viết một ứng dụng để hiển thị một số tin tức từ một cổng. Tin tức được lấy bằng cách sử dụng một tệp JSON từ Internet và sau đó được lưu trữ vào một NSMutableArray bằng cách sử dụng Mô hình CoreData. Rõ ràng một người dùng không thể xóa tin tức từ tệp JSON trên Internet, nhưng anh ta có thể ẩn chúng ở địa phương. Những vấn đề đi ra ở đây, nơi tôi có đoạn mã sau:NSMutableArray removeObjectAtIndex: ném ngoại lệ đối số không hợp lệ

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {  
if (editingStyle == UITableViewCellEditingStyleDelete) { 
    if(!moc){ 
     moc = [[NewsFetcher sharedInstance] managedObjectContext]; 
    } 
    [[dataSet objectAtIndex:indexPath.row] setEliminata:[NSNumber numberWithBool:YES]]; 
    NSError *error; 
    if(![moc save:&error]){ 
     NSLog(@"C'è stato un errore!"); 
    } 
    [dataSet removeObjectAtIndex:indexPath.row]; 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; 
} 

Dòng:

[dataSet removeObjectAtIndex:indexPath.row];

nguyên nhân ứng dụng của tôi sụp đổ với các lỗi sau:

2010-07-12 19:08:16.021 ProvaVideo[284:207] * -[_PFArray removeObjectAtIndex:]: unrecognized selector sent to instance 0x451c820 2010-07-12 19:08:16.022 ProvaVideo[284:207] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_PFArray removeObjectAtIndex:]: unrecognized selector sent to instance 0x451c820'

Tôi cố gắng hiểu tại sao nó không hoạt động nhưng tôi không thể. Nếu tôi khởi chạy lại ứng dụng, bản mới sẽ bị hủy một cách chính xác. Bất kỳ đề xuất nào ?? Cảm ơn trước.


Interface:

@interface ListOfVideo : UITableViewController <NSFetchedResultsControllerDelegate> { 
    NSMutableArray *dataSet; 
} 
@property (nonatomic, retain) NSMutableArray *dataSet; 

// In the .m file: 
@synthesize dataSet; 

khởi trong viewDidLoad:

dataSet = (NSMutableArray *) [[NewsFetcher sharedInstance] 
           fetchManagedObjectsForEntity:@"News" 
           withPredicate:predicate 
           withDescriptor:@"Titolo"]; 
[dataSet retain]; 

updateDatabase ... đây là khi kiểm tra cho các tin tức mới từ net, tôi thêm chúng trong MutableArray:

[dataSet addObject:theNews]; 
+1

Bạn có chắc chắn rằng tập dữ liệu là NSMutableArray không? Nếu nó không đáp ứng với removeObjectAtIndex: nó có thể chỉ là một NSArray. –

+1

Nó không phải là một 'NSMutableArray' nếu nó không đáp ứng với bộ chọn đó. Bạn có thể không tạo đúng hoặc sử dụng nhầm thuộc tính ['copy'] (http://stackoverflow.com/questions/3220120/nsmutablearray-addobject-nsarrayi-addobject-unrecognized-selector-sent-to/3220137#3220137). Nếu bạn có nghi ngờ, hãy thử kiểm tra nó bằng cách sử dụng '-isKindOfClass:'. –

+0

umble, nó không phải là một NSMutableArray, nhưng: @interface ListOfVideo: UITableViewController {NSMutableArray * dataSet; } @property (nonatomic, giữ lại) NSMutableArray * dataSet; ... // Trong tệp .m @synthesize dataSet; – IssamTP

Trả lời

23

NewsFetcher trả về cho bạn một mảng không thể thay đổi, không phải là trường hợp có thể thay đổi được. Sử dụng sau đây thay vì để khởi tạo:

NSArray *results = [[NewsFetcher sharedInstance] 
        fetchManagedObjectsForEntity:@"News" 
        withPredicate:predicate 
        withDescriptor:@"Titolo"]; 
dataSet = [results mutableCopy]; 

Một biểu hiện như A *a = (A*)b; chỉ phôi con trỏ tới một kiểu khác nhau - nó không chuyển đổi/thay đổi kiểu thực tế của các trường hợp nó trỏ tới.

+0

LMAO Nó hoạt động. Thật là một noob tôi. – IssamTP

5

Xác minh rằng dữ liệuSet là một NSMutableArray. Ngoại lệ này bị ném vì nó không trả lời removeObjectAtIndex.

+0

Mumble, nó không phải là một NSMutableArray, nhưng: @interface ListOfVideo: UITableViewController { \t NSMutableArray * dataSet; } @property (nonatomic, retain) NSMutableArray * dataSet; ... // Trong tệp .m @synthesize dataSet; – IssamTP

+2

Thuộc tính cho một mảng có thể thay đổi không làm cho mảng trở nên biến đổi một cách kỳ diệu. –

+0

@Joshua, trong khi nó không "kỳ diệu" làm cho nó có thể thay đổi, nó sẽ ngăn chặn một mảng biến đổi khỏi bị đột biến nó không được xác định đúng. – BlackHatSamurai

1

jdot là đúng DataSet phải NSMutableArray ..

bạn phải làm theo cách này ..

dataSet = [NSMutableArray arrayWithArray:[[NewsFetcher sharedInstance] 
           fetchManagedObjectsForEntity:@"News" 
           withPredicate:predicate 
           withDescriptor:@"Titolo"]]; 

Bây giờ DataSet là một trường hợp có thể thay đổi trong những mảng bạn nhận được từ NewsFetcher và nó đã giành' t sụp đổ về việc loại bỏ các đối tượng.

+0

Điều này đã giải quyết được vấn đề của tôi! :) Cảm ơn @pankaj :) –

Các vấn đề liên quan