2011-05-20 3 views
0

У меня есть функция addToFavourites, которая вызывает ошибку EXC_BAD_ACCESS. В принципе, у меня есть View View Controller со списком всех фаворитов, которые пользователь добавил ранее, теперь, когда вы нажимаете на одного из фаворитов, он подталкивает представление к detailViewController, это отлично работает. На контроллере подробных представлений у меня есть кнопка добавления в избранное, эта кнопка изменяет на удаление из избранного, если обнаруживает, что ключ уже существует в словаре addToFavourites. Проблема возникает, когда пользователь обращается к этому detailViewController со страницы избранных страниц, а также с главной страницы, в которой перечислены все подробные элементы. Они могут это сделать, поскольку у меня есть панель вкладок.EXC_BAD_ACCESS при запуске функции addToFavourites

Так что скажите, что я нахожусь в detailView, доступ к которому осуществляется через страницу избранных, кнопка избранного имеет «удалить из избранного», это правильно. Но затем скажем, что я нажму кнопку «Удалить из избранного», кнопка изменится на «добавить в избранное» и удалит ее из словаря. Пока все работает нормально. Теперь, когда я перехожу к тому же detailView, но на этот раз доступ с другой вкладки на панели вкладок, во-первых, кнопка «Избранное» все еще читает «удалить из избранного», и когда я впервые нажимаю эту кнопку, она изменяется на «добавить к избранное ", а затем, когда я нажму снова, я получаю эту ошибку EXC_BAD_ACCESS.

Вот addToFavouritesFunction:

- (IBAction)addToFavourites:(id)sender { 
    NSString *type = [[NSUserDefaults standardUserDefaults]objectForKey:@"type"]; 
    if(type == @"v") { 
     NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"]; 
     NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"]; 
     if([[addToFavouritesDictionary allKeys] containsObject:ID1]) { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary removeObjectForKey:ID1]; 
      [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"New Dictionary: %@", addToFavouritesDictionary); 
     } else { 
      NSString *ID1 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID1"]; 
      [addToFavouritesDictionary setObject:Name forKey:ID1]; 
      [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
      //[addToFavouritesDictionary release]; 
     } 
} else { 
     //NSString *area = [[NSUserDefaults standardUserDefaults]objectForKey:@"area"]; 
     NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"]; 
     if([[addToFavouritesDictionary allKeys] containsObject:ID2]) { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary removeObjectForKey:ID2]; 
      [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Dictionary: %@", addToFavouritesDictionary); 
     } else { 
      NSString *ID2 = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID2"]; 
      [addToFavouritesDictionary setObject:Name forKey:ID2]; 
      [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/SavedDict.data"]; 
      [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
      NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
     } 
    } 
} 

Спасибо за любую помощь!

ответ

0

Проверка с отладчиком показывает ли сбой линии точно ... и установить точку останова после этого для проверки значения

+0

Ok эта линия кажется причиной проблемы: [addToFavouritesDictionary SetObject : Name forKey: ID1]; –

+0

Кажется, что сейчас работает, я просто сохранил объект Name при инициализации. Единственная проблема теперь в том, что кнопки добавления в избранное и удаления в избранные все еще различаются на обоих элементах detailViewControllers, так или иначе, чтобы сохранить их одинаковыми? –

0

Ну ... или ваш объект addToFavouritesDictionary или ваш объект Имя было высвобождены. Как вы создаете эти объекты? Либо вы освобождаете их до того, как захотите, либо не сохранили их в первую очередь.

Objective-C Memory Management

0

Вы должны, вероятно, не использовать строку:

if(type == @"v") { 

Что вы делаете здесь сравнение указателя для переменной type указателя на строку @"v". Вместо этого, вы должны использовать метод, который сравнивает содержимого строки:

if ([type isEqualToString:@"v") { 

EDIT

Самым простым способом сохранить свои названия то же самое будет хранить текст в NSUserDefaults. Вы могли бы сделать что-то, как показано ниже при каждом нажатии кнопки:

// For "Add to Favorites" 
[[NSUserDefaults standardUserDefaults] setObject:@"+ Favorites" forKey:@"ButtonState"]; 

// For "Remove from Favorites" 
[[NSUserDefaults standardUserDefaults] setObject:@"- Favorites" forKey:@"ButtonState"]; 

Тогда вы должны выполнить что-то вроде этого, когда вид нагрузки:

[favoritesButton setTitle:(NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:@"ButtonState"] forState:UIControlStateNormal]; 
+0

О да, спасибо, что заметили это. Любые идеи о том, как сохранить заголовок UIButtons одинаковым на обоих контроллерах представлений? Я бы поставил метод в viewWillAppear?Спасибо –

+0

Проверьте мое изменение для получения помощи по вашему вопросу. – FreeAsInBeer

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