Множественный выбор UIView в индексе iCarousel

Итак, я хочу выделить конкретный UIView в iCarousel, когда я нажимаю кнопку в этом представлении, и я хочу иметь возможность выделять столько представлений, сколько захочу, в карусели. Итак, у меня есть кнопка, которая устанавливает альфа-канал UIImageview в представлении. Проблема, с которой я сталкиваюсь, заключается в том, что хотя он знает индекс представления, я не знаю, как вызвать соответствующий индекс 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];
}

Который работает, но позволяет мне выбирать только один элемент за раз и проверять его. Я хочу иметь возможность выбирать/отменять выбор нескольких элементов одновременно.


person Joe Komputer    schedule 10.06.2014    source источник


Ответы (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, присвойте ему тег с помощью инспектора свойств. Здесь я дал виду тег 32.

введите здесь описание изображения

Теперь SOME_TAG в моем предложении выше должно быть 32, так что...

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

// if this doesn't log an image view, then something is wrong.
person danh    schedule 10.06.2014
comment
Итак, я добавил то, что вы сказали, но когда я добавил этот 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];, карусель, кажется, работает, но только первый элемент проверяется и снимается. - person Joe Komputer; 10.06.2014
comment
Я заменил checkImg = (UIImageView *)[checkImg viewWithTag:chkTag]; на этот checkImg = (UIImageView *)[checkImg viewWithTag:chkTag]; и все заработало. Но теперь только один элемент может быть проверен одновременно, когда я хочу, чтобы несколько элементов проверялись одновременно. - person Joe Komputer; 10.06.2014
comment
Я обновил свой вопрос, чтобы отразить внесенные мной изменения. - person Joe Komputer; 10.06.2014
comment
ваши дополнения кода не совсем правильные. вы не получаете тег из представления изображения, вы получаете представление изображения с помощью тега. Настройте его в IB с помощью тега, а затем найдите его в представлении с помощью этого тега. Пожалуйста, смотрите мое редактирование. - person danh; 11.06.2014
comment
Он регистрирует UIView, и эта строка кода по-прежнему делает карусель пустой checkImg = (UIImageView *)[view viewWithTag:32]; Она не выдает никаких ошибок, она просто не загружает карусель. - person Joe Komputer; 11.06.2014
comment
Проблема в том, что он регистрирует UIView, поскольку мы думаем, что это UIImageView. Я думаю, что происходит то, что вы устанавливаете альфа-канал всего представления на 0,0. Очень важно, чтобы тег был ненулевым и чтобы тег был установлен в подвиде UIImageView представления, которое вы возвращаете в карусель. - person danh; 11.06.2014
comment
О, я думал, вы хотите, чтобы я добавил тег в UIView, а не в UIImageView. Теперь работает, спасибо за помощь! - person Joe Komputer; 11.06.2014