索引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的多选的主要内容,如果未能解决你的问题,请参考以下文章