2013-09-13 2 views
0

Я пытаюсь добавить аксессуар (отмеченный/непроверенный) в это табличное представление, и по какой-то причине xCode сообщает мне, что что-то не так с этой строкой: [item setObject: cell forKey: @ "StrainTableCell"];Ошибка NSInternalInconsistencyException в AccessView TableView?

консоль бросает мне эту ошибку:

* Согласующего приложение из-за неперехваченное исключение 'NSInternalInconsistencyException', причина: '- [__ NSCFDictionary SetObject: forKey]: мутирует метод направлен непреложный объект' *

Кто-нибудь знает почему? См. Фрагменты кода ниже.

ViewController.h

#import <UIKit/UIKit.h> 
#import "PickerViewController.h" 


@interface PickerResultsTableViewController : UITableViewController { 

    NSIndexPath *currentDetailPath; 
    bool loaded; 


    NSArray *Strains; 
    NSArray *searchResults; 
    NSMutableArray *dataArray; 
    NSMutableData *data; 

} 

- (IBAction)backbuttonpressed: (UIBarButtonItem *)sender; 

@property (strong, nonatomic) NSArray *favoritesArrayset; 
@property (strong, nonatomic) IBOutlet UITableView *PickerTableView; 
@property (nonatomic, retain) NSArray *searchResults; 
@property (nonatomic, strong) NSMutableSet * favoritesArray; 

@end 

ViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 

    static NSString *strainTableIdentifier = @"StrainTableCell"; 

    StrainTableCell *cell = (StrainTableCell *)[tableView dequeueReusableCellWithIdentifier:strainTableIdentifier]; 
    if (cell == nil) 


     cell = [[StrainTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strainTableIdentifier]; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.selectionStyle = UITableViewCellSelectionStyleBlue; 


    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StrainTableCell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 



     if (tableView == PickerTableView) { 
      NSLog(@"Using the search results"); 

      cell.titleLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
      cell.descriptionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Description"]; 
      cell.ratingLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Rating"]; 
      cell.ailmentLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ailment"]; 
      cell.actionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Action"]; 
      cell.ingestLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ingestion"]; 

      NSLog(@"%@", searchResults); 



     } else { 
      NSLog(@"Using the FULL LIST!!"); 
      cell.titleLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
      cell.descriptionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Description"]; 
      cell.ratingLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Rating"]; 
      cell.ailmentLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ailment"]; 
      cell.actionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Action"]; 
      cell.ingestLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ingestion"]; 

     } 


    NSMutableDictionary *item = [Strains objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [item objectForKey:@"text"]; 

    [item setObject:cell forKey:@"StrainTableCell"]; 
    BOOL checked = [[item objectForKey:@"checked"] boolValue]; 

    NSLog(@"%i",checked); 
    UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    button.frame = frame; 
    [button setBackgroundImage:image forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    button.backgroundColor = [UIColor clearColor]; 
    cell.accessoryView = button; 

    return cell; 

} 
+0

Почему вы добавляете ячейку в словарь в первую очередь? Поскольку ячейки перерабатываются, я думаю, что это, вероятно, не очень хорошая идея. – rdelmar

ответ

0

Ну, компилятор дает вам довольно хороший намек о том, что происходит: mutating method sent to immutable object. Даже если вы объявляете элемент как NSMutableDictionary, это не означает, что объект, который вы получаете от [Strains objectAtIndex:indexPath.row], на самом деле является изменяемым словарем.

Даже если вы делаете что-то вроде этого:

NSDictionary *dict1 = [[NSDictionary alloc] init]; 

//the following line does not convert dict1 into a mutable dictionary 
NSMutableDictionary *dict2 = (NSMutableDictionary*)dict1; 

Чтобы решить этот вопрос убедиться, что объекты, добавленные в Strains являются изменяемыми словари. Вы можете сделать это, напрямую создавая экземпляр, или вызвав метод mutableCopy.

Надеюсь, это поможет!

+0

Хм, это так странно. Я использую этот же код в другом наборе View Controllers, и он отлично работает ...? Мне интересно, если я просто упустил что-то, что другие VCs ... –

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