2013-06-05 8 views
2

Я использую iCarousel Library, и у меня есть некоторые проблемы.EXC_BAD_ACCESS (код = 2 или код 1) при действии кнопки вызова

В контролях демонстрационного примера проект, 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; 
} 

Потому что я использую раскадровку создать контроллер Просмотра и настройку вид, как это:

- (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; 
} 

Когда я добавить действие к любой кнопке в окне я получаю ошибку:

enter image description here

Я пробовал много вещей, рекомендуемых в Stackoverflow, но я не могу найти решение:

Я попытался:

  • Установка розетки для Strong (кто-то говорит, что это проблема, потому что ARC)
  • Удаление отправителя в действии
  • Добавление метода в View Controller, которые имеют тот icarousel

**** UPDA TE ****

Теперь я вижу другую проблему. Когда я определить действие в DUNewsItemViewController и попробовать его в тренажере, он говорит:

-[__NSCFType btnTest:]: unrecognized selector sent to instance 0x1577c650 

Итак, я ADDE метод в .m файле View Controller, которые имеют iCarousel и проблема все та же :

EXC_BAD_ACCESS (code=2) 

Некоторая информация:

  • Я использую ARC
  • Это на раскадровки
  • Количество просмотров динамична
+0

Какая у вас розетка, которую вы настроили на сильную? Выход для 'iCarousel',' DUNewsItemViewController' или 'View'? – Firo

+0

выход кнопки @Firo – FxckDead

ответ

3

Ваша главная проблема здесь не с точки зрения конкретно, но, а с вашей DUNewsItemViewController инстанции. Вы создаете свой контроллер в предложенном вами методе и возвращаете представление. Вид сохраняется на iCarousel. С другой стороны, ваш DUNewsItemViewController нет. Нет ничего, что сильно указывало бы на это. Поскольку нет никаких сильных указателей на это, он освобождается. Ваше представление отображается правильно, со всеми вашими кнопками, потому что опять же оно сохраняется за пределами вашего DUNewsItemViewController. Когда кнопка нажата, она пытается получить доступ к своему методу действия и терпит неудачу, потому что контроллер больше не существует.

Чтобы устранить эту проблему, вам необходимо создать сильный указатель на контроллер (а не кнопку, как вы пытались раньше). Я не рекомендую совершенную стратегию, а не ту, которая работает.

Вы можете создать изменчивый массив (как свойство) и добавить в него наблюдаемые контроллеры (если их несколько) при их создании.Таким образом, контроллер, который iCarousel «S делегат/DataSource содержит ссылку на него:

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.

Если что-то не имеет смысла, дайте мне знать. Опять же, есть, вероятно, более эффективные реализации, но это должно сработать. Причина, по которой XIBs работали в этом примере, состоит в том, что они являются только UIViews не UIViewController подклассами, как вы используете. Опять же, ваше представление работает так, как должно (отображение, как и в примере), но ваш контроллер освобождается от отказа (не так, как пример, поскольку не используется контроллер).

+0

wow спасибо, это имеет смысл!, Позвольте мне попробовать, и я скажу вам, если это сработает! @Firo – FxckDead

+0

Это не работает bro, я объявляю свойство '@property (nonatomic, strong) NSMutableArray * views;' внутри файла .m, и я добавляю объекты в порядке, но проблема такая же. ** я обновляю вопрос ** @Firo – FxckDead

+0

Не добавляйте представления в массив. Добавьте ViewControllers. (Я предполагаю, что вы просто добавили представления, так как ваш массив называется 'views' – Firo

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