EXC_BAD_ACCESS (код =2 или код 1) при нажатии кнопки вызова
Я использую библиотеку iCarousel и у меня возникли некоторые проблемы.
В демонстрационном примере проекта Controls используется файл XIB, и представление настраивается следующим образом:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
if (!view)
{
//load new item view instance from nib
//control events are bound to view controller in nib file
//note that it is only safe to use the reusingView if we return the same nib for each
//item view, if different items have different contents, ignore the reusingView value
view = [[[NSBundle mainBundle] loadNibNamed:@"ItemView" owner:self options:nil] lastObject];
}
return view;
}
Поскольку я использую Раскадровки, я создаю View Controller и настраиваю вид следующим образом:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
NSString * storyboardName = @"MainStoryboard";
NSString * viewControllerID = @"DuuinNewsItem";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
//create new view if no view is available for recycling
if (!view)
{
DUDuuin *tDuuin = [_duuins objectAtIndex:index];
DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
controller.duuin = tDuuin;
view = controller.view;
[view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];
}
return view;
}
Когда я добавляю действие к любой кнопке в представлении, я получаю сообщение об ошибке:
Я пробовал много вещей, которые рекомендуются в Stackru, но я не могу найти решение:
Я старался:
- Настройка выхода на сильный (кто-то говорит, что это проблема, потому что ARC)
- Удаление отправителя в действии
- Добавление метода в View Controller, который имеет icarousel
****ОБНОВИТЬ****
Теперь я вижу другую проблему. Когда я определяю Action в DUNewsItemViewController и пробую его в симуляторе, он говорит:
-[__NSCFType btnTest:]: unrecognized selector sent to instance 0x1577c650
Итак, я добавляю метод в.m файл View Controller, у которого iCarousel и проблема все та же:
EXC_BAD_ACCESS (code=2)
Некоторая информация:
- Я использую ARC
- Это на раскадровке
- Количество просмотров является динамическим
1 ответ
Ваша главная проблема здесь связана не с мнением, а с DUNewsItemViewController
пример. Вы создаете свой контроллер указанным вами методом и возвращаете представление. Эта точка зрения сохраняется за iCarousel
, Ваш DUNewsItemViewController
с другой стороны нет. Нет ничего, на что бы это сильно указывало. Поскольку нет сильных указателей на него, он освобождается. Ваш вид отображается правильно со всеми вашими кнопками, потому что, опять же, он сохраняется за пределами вашего DUNewsItemViewController
, Когда кнопка нажата, она пытается получить доступ к своему методу действия и терпит неудачу, потому что контроллер больше не существует.
Чтобы решить эту проблему, вам нужно создать сильный указатель на ваш контроллер (а не кнопку, как вы пытались раньше). Я не рекомендую идеальную стратегию, а ту, которая работает.
Вы можете создать изменяемый массив (как свойство) и добавить в него viewcontrollers (если их больше одного) по мере их создания. Таким образом, контроллер, который iCarousel
делегат / источник данных содержит ссылку на него:
if (!view)
{
DUDuuin *tDuuin = [_duuins objectAtIndex:index];
DUNewsItemViewController * controller = (DUNewsItemViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
// Add controller to array to hold a strong reference to it.
[self.myMutableArray addObject:controller];
//
controller.duuin = tDuuin;
view = controller.view;
[view setFrame:CGRectMake(0, 0, 314.0f, 415.0f)];
}
В противном случае, если есть только один (или несколько), вы можете создать уникальные торговые точки:
@property (strong, nonatomic) DUNewsItemViewController *firstVC;
и в вашем carousel:viewForItemAtIndex:reusingView:view
метод включает строку self.firstVC = controller
,
Если что-то не имеет смысла, дайте мне знать. Опять же, есть, вероятно, лучшие реализации, но это должно работать. Причина того, что XIB работали в этом примере, заключается в том, что они просто UIViews
не UIViewController
подклассы, как вы используете. Опять же, ваше представление работает так, как должно (отображается, как в примере), но ваш контроллер освобождается (не так, как в примере, так как контроллер не используется).