2010-05-17 4 views
2

У меня была такая проблема раньше, и она не получила удовлетворительного ответа.NSMutableArray не может быть добавлен в

У меня есть viewcontroller с свойством «counties», которое является NSMutableArray. Я собираюсь развернуть экран навигации, чтобы посмотреть, как выбрать граф для географического поиска. Таким образом, страница поиска развернется на страницу «select counties».

Передаю NSMutableArray *counties второму контроллеру, когда я нажимаю второй в стеке навигации. Я фактически установил свойство «selectedCounties» второго контроллера (также NSMutableArray) с указателем на «округи» моего первого контроллера, как вы увидите ниже.

Когда я иду в addObject к этому, хотя, я получаю это:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object' 

Вот мой код:

в SearchViewController.h:

@interface SearchViewController : UIViewController 
{ 
    .... 
    NSMutableArray *counties; 
} 

.... 
@property (nonatomic, retain) NSMutableArray *counties; 

в SearchViewController.m:

- (void)getLocationsView 
{ 
    [keywordField resignFirstResponder]; 
    SearchLocationsViewController *locationsController = 
      [[SearchLocationsViewController alloc] initWithNibName:@"SearchLocationsView" bundle:nil]; 
    [self.navigationController pushViewController:locationsController animated:YES]; 
    [locationsController setSelectedCounties:self.counties]; 
    [locationsController release]; 
} 

в SearchLocationsViewController.h:

@interface EventsSearchLocationsViewController : UIViewController 
    <UITableViewDelegate, UITableViewDataSource> 
{ 
    ... 
    NSMutableArray *selectedCounties; 

} 

... 
@property (nonatomic, retain) NSMutableArray *selectedCounties; 

в SearchLocationsViewController.m (точка здесь, мы переключая каждый элемент таблицы активны или нет в списке выбранных округов):

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([self.selectedCounties containsObject:[self.counties objectAtIndex:indexPath.row]]) { 
     //we're deselcting! 
     [self.selectedCounties removeObject:[self.counties objectAtIndex:indexPath.row]]; 
     cell.accessoryView = [[UIImageView alloc] 
           initWithImage:[UIImage imageNamed:@"red_check_inactive.png"]]; 
    } 
    else { 
     [self.selectedCounties addObject:[self.counties objectAtIndex:indexPath.row]]; 
     cell.accessoryView = [[UIImageView alloc] 
           initWithImage:[UIImage imageNamed:@"red_check_active.png"]]; 
    } 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Мы умираем в [self.selectedCounties addObject.....

Теперь, когда я сам NSLog [self.selectedCounties class], это говорит мне, что это NSCFArray.

Как это происходит? Я понимаю о пакетах классов (или я ДУМАЮ, я все равно), но это явно конкретный тип, и он теряет его подклассирование в какой-то момент, что убивает все это. Я просто не понимаю, почему это произойдет.

+0

Как вы создаете свой counti es объект? – Vladimir

+0

Где вы назначили «графства»? – kennytm

ответ

4

Я предполагаю, что вы не выделять массив должным образом (например, NSMutableArray *arr = [[NSArray alloc] init], или присвоение NSArray к переменной NSMutableArray. Вы можете разместить код, где вы инициализировать массив?

+1

Guilty as charge: 'self.counties = [[NSArray alloc] initWithObjects: @" Current Location ", nil];' Позвольте мне исправить это и посмотреть, неожиданно ли ситуация срабатывает. –

+0

Бинго. Проблема заключалась в том, что я понял, что я кодирую, что мне нужно быть Mutable, и я не возвращался и исправлял его везде, где нужно было исправление, я думаю. Я исхожу из языков, где вещи уже изменяемы, поэтому это различие для меня еще не является естественным. БЛАГОДАРЯ!! –

1

Где вы инициализации ? объект, который вы установите в качестве графств может быть, вы сделали ошибку, как:

NSMutableArray *counties = [[NSMutableArray alloc] init]; 

в этом случае нет ошибки компиляции будет всплывал, но вы не можете принять изменения на массив, созданный как и

+0

Спасибо - @ eman избил вас на минуту или две, но это правильный ответ. –

Смежные вопросы