【问题标题】:Multiple selections of UIView in index iCarousel索引iCarousel中UIView的多选
【发布时间】: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];
}

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

【问题讨论】:

    标签: ios objective-c xcode uiview icarousel


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多