我正在使用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;
}
当我向视图中的任何按钮添加操作时,我收到错误:
我已经尝试了Stackoverflow中推荐的很多东西,但我找不到解决方案:
我试过了:
**** **** UPDATE
现在我看到其他问题。当我在DUNewsItemViewController中定义Action并在模拟器中尝试它时,它说:
-[__NSCFType btnTest:]: unrecognized selector sent to instance 0x1577c650
所以,我在视图控制器的.m文件中添加了iCarousel并且问题仍然相同的方法:
EXC_BAD_ACCESS (code=2)
一些信息:
答案 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
子类,就像您正在使用的那样。同样,您的视图正常工作(显示,就像示例一样),但您的控制器正在被解除分配(不像示例,因为没有使用控制器)。