呼叫按钮动作时EXC_BAD_ACCESS(代码= 2或代码1)

时间:2013-06-05 22:48:34

标签: iphone ios delegates icarousel

我正在使用iCarousel Library并遇到一些问题。

在Controls Demo Example Project中,使用了一个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;
}

因为我正在使用Storyboard,所以我创建了一个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;
}

当我向视图中的任何按钮添加操作时,我收到错误:

enter image description here

我已经尝试了Stackoverflow中推荐的很多东西,但我找不到解决方案:

我试过了:

  • 将插座设置为Strong(有人说这是一个问题,因为ARC)
  • 在操作中删除发件人
  • 在视图控制器中添加具有icarousel
  • 的方法

**** **** UPDATE

现在我看到其他问题。当我在DUNewsItemViewController中定义Action并在模拟器中尝试它时,它说:

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

所以,我在视图控制器的.m文件中添加了iCarousel并且问题仍然相同的方法:

EXC_BAD_ACCESS (code=2)

一些信息:

  • 我正在使用ARC
  • 它在故事板上
  • 视图数量是动态的

1 个答案:

答案 0 :(得分:3)

此处的主要问题不在于具体视图,而在于您的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子类,就像您正在使用的那样。同样,您的视图正常工作(显示,就像示例一样),但您的控制器正在被解除分配(不像示例,因为没有使用控制器)。