索引iCarousel中UIView的多选

Posted

技术标签:

【中文标题】索引iCarousel中UIView的多选【英文标题】:Multiple selections of UIView in index iCarousel 【发布时间】:2014-06-10 18:33:09 【问题描述】:

因此,当我单击该视图中的按钮时,我想在 iCarousel 中突出显示特定的UIView,并且我希望能够在轮播中突出显示尽可能多的视图。所以我有一个按钮可以在视图中设置UIImageview 的alpha 我遇到的问题是虽然它知道视图的索引我不知道如何调用UIImageview 的相应索引在那个视图中。所以我在一个自定义笔尖中设置了UIImageview,我用这段代码设置了 iCarousel 的视图:

根据@danh 回答更新

//.h
@property (nonatomic, strong)NSMutableSet *selected;
//.m
- (void)viewDidLoad
 
 self.selected = [NSMutableSet set];


- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view


    //create new view if no view is available for recycling
    if (view == nil)
    
        view = [[[NSBundle mainBundle] loadNibNamed:@"ItemView" owner:self options:nil] lastObject];

 int chkTag = checkImg.tag;
checkImg = (UIImageView *)[checkImg viewWithTag:chkTag];

NSNumber *indexNum = [NSNumber numberWithInt:index];
// here's where the view state gets set
checkImg.alpha = ([self.selected member:indexNum])? 1.0 : 0.0;
  return view;

然后我在选择特定视图时调用它:

- (void)carouselCurrentItemIndexUpdated:(iCarousel *)carousel1
    NSInteger indexInt = carousel1.currentItemIndex;
NSNumber *index = [NSNumber numberWithInt:indexInt];
if ([self.selected member:index]) 
    [self.selected removeObject:index];
 else 
    [self.selected addObject:index];


// now just reload that item, and let the viewForItemAtIndex
// take care of the selection state
[carousel reloadItemAtIndex:indexInt animated:NO];

这可行,但只允许我一次选择一项并检查它。我希望能够一次选择/取消选择多个项目。

【问题讨论】:

【参考方案1】:

它就像一个表格视图。您需要的是选定项目的模型。这需要超过任何给定的轮播视图。所以添加一个property NSMutableSet *selectedItems并用self.selected = [NSMutableSet set];初始化它

当按钮被按下时,您想要将当前索引添加到该集合(该按钮是否切换选择?如果是,那么如果它不存在则您想要添加它,或者如果它存在则移除它)。

NSInteger indexInt = carousel1.currentItemIndex;
NSNumber *index = [NSNumber numberWithInt:indexInt];
if ([self.selected member:index]) 
    [self.selected removeObject:iIndex];
 else 
    [self.selected addObject:index];


// now just reload that item, and let the viewForItemAtIndex
// take care of the selection state
[carousel reloadItemAtIndex:indexInt animated:NO];

最后一步是在配置视图时对选择状态做出反应:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view 

    if (view == nil) 
        view = [[[NSBundle mainBundle] loadNibNamed:@"ItemView" owner:self options:nil] lastObject];
    

    // get the checkImg view however you do that already.  if you're confused about this
    // give it a tag when you create it, then find it like this:
    UIImageView *checkImg = (UIImageView *)[view viewWithTag:SOME_TAG];

    NSNumber *indexNum = [NSNumber numberWithInt:index];
    // here's where the view state gets set
    checking.alpha = ([self.selected member:indexNum])? 1.0 : 0.0;

  return view;

编辑 - 部分问题似乎是创建然后获取轮播的子视图。 UIView 提供了一个可以提供帮助的标记属性,但发布的代码会出现一些错误。以下是标签的使用方法:

如果您在 IB 中创建图像视图,请使用属性检查器给它一个标签。这里,我给了一个view的tag 32。

现在我上面建议中的 SOME_TAG 应该是 32,所以...

UIImageView *checkImg = (UIImageView *)[view viewWithTag:32];
NSLog(@"%@", checkImg);

// if this doesn't log an image view, then something is wrong.

【讨论】:

所以我添加了你所说的但是当我添加这个int chkTag = checkImg.tag; checkImg = (UIImageView *)[view viewWithTag:chkTag]; NSNumber *indexNum = [NSNumber numberWithInt:index]; // here's where the view state gets set checkImg.alpha = ([self.selected member:indexNum])? 1.0 : 0.0; 但它似乎打破了轮播,当我删除checkImg = (UIImageView *)[view viewWithTag:chkTag]; 轮播似乎工作但只有第一项检查和取消选中。 我将 checkImg = (UIImageView *)[checkImg viewWithTag:chkTag]; 更改为 checkImg = (UIImageView *)[checkImg viewWithTag:chkTag]; 并使其正常工作。但是现在当我想一次检查多个项目时,一次只能检查一个元素。 我更新了我的问题以反映我所做的更改。 您的代码添加不太正确。您没有从图像视图中获取标签,而是使用标签获取图像视图。使用标签在 IB 中设置它,然后使用该标签在视图中搜索它。请查看我的编辑。 它记录了一个UIView,这行代码似乎仍然让carousel空白checkImg = (UIImageView *)[view viewWithTag:32];它没有抛出任何错误,它只是没有加载carousel。

以上是关于索引iCarousel中UIView的多选的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中的 ICarousel

iCarousel 滚动

表格单元格视图中的 iCarousel 视图根本不滚动

iCarousel 与 iOS 6.1 中具有标签栏控制器的应用程序集成

IOS中的多选

将自定义 UIView 添加到 iCarousel