2015-07-25 4 views
0

Я работаю с UICollectionView с данными моей модели. У меня есть эта модель данные подготовленыНевозможно переключить Bool in loop

struct Room { 
     let type: String 
     let position: String 
     var hidden: Bool? 

     static let typeA = "A" 
     static let typeB = "B" 
     static let typeC = "C" 

     static let positionA = "A" 
     static let positionB = "B" 
     static let positionC = "C" 

     static var rooms = [ 
      Room(type: typeA, position: positionA, hidden: false), 
      Room(type: typeA, position: positionB, hidden: false), 
      Room(type: typeA, position: positionC, hidden: false), 
      Room(type: typeB, position: positionA, hidden: false), 
      Room(type: typeB, position: positionB, hidden: false), 
      Room(type: typeB, position: positionC, hidden: false), 
      Room(type: typeC, position: positionA, hidden: false), 
      Room(type: typeC, position: positionB, hidden: false), 
      Room(type: typeC, position: positionC, hidden: false) 
     ] 
    } 

для UICollectionViewCells. Что мне нужно сделать, это переключить hidden логическое значение, поэтому он может фильтровать клетки с этим

В cellForItemAtIndexPath

if Room.rooms[indexPath.row].hidden == true { 
     cell.layer.opacity = 0.5 
    } 

и сделать это так, у меня есть эта функция в Room структуры

static func toggleHidden(whichOne: String) { 
    if var roomType = rooms.type { 
     if roomType.type == whichOne || roomType.position == whichOne { 
     roomType.hidden = true 
     } 
    } 
    } 

Но он выдает сообщение об ошибке:

Cannot assign to 'hidden' in 'roomType'

я могу сделать что-то вроде этого

static func toggleHidden(whichOne: Int) { 
    (rooms[whichOne].hidden == false) ? (rooms[whichOne].hidden = true) : (rooms[whichOne].hidden = false) 
    } 

Тем не менее, нужно фильтровать строки, так что несколько элементов могут быть переключены одновременно. То, что я делаю, заключается в переключении hidden bool всех элементов, которые имеют строку whichOne.

Этот подход не умный прежде всего ...? Любой совет будет оценен, спасибо заранее.

+0

«Комната» - это класс/структура с переменными 'комнатами', вмещающими объекты« Комната »??? Очень запутанный и непредсказуемый в ошибках, которые он может произвести. – Mundi

+0

Извините за путаницу, обновленный код. – provdr

ответ

1

В roomType.hidden = true вы пытаетесь присвоить true/false переменной типа String (typeA, typeB и т. Д.).

Возможно, вы имеете в виду room.hidden.

Чтобы установить все номера TypeA в скрытых:

var typeARooms = rooms.filter { $0.type == typeA } 
for room in typeARooms { room.hidden = true } 
collectionView.reloadData() // not animated 
+0

Это выглядит так хорошо, но оно вызывает ту же ошибку: «Не могу назначить« скрытый »в« roomType »... – provdr

+0

Удостоверьтесь, что это' room' not 'room.type' ... – Mundi

1

Это очень похоже на ответ Мунди, но вы должны сделать следующее

var typeARooms = Room.rooms.filter { $0.type == "A" } 
    for var i = 0; i < typeARooms.count; i++ { 
     var room = typeARooms[i] 
     room.hidden = true 
    } 

Для в цикле элементы предназначены только для чтения (пусть переменные). Вот почему вам нужно явно использовать var, чтобы иметь возможность изменять структуру.

+0

Как-то это все еще бросает Ошибка 'Невозможно присвоить' .... Я пропустил что-то основное ...? – provdr

+0

Вы используете '' let'' вместо '' var'' где-то. Вот почему эта ошибка возникает. Я запускал свой код в Xcode без каких-либо проблем, используя предоставленную вами структуру Room. let == immutable, var == mutable –

+0

Очищенный кеш и, в конечном итоге, код работал, извините за это.Тем не менее, кажется, что функция, которую вы предоставили, копирует элементы равными «A» из массива 'room' в' typeARooms', а затем устанавливает bools в true. Есть ли что-то, что вы можете напрямую изменить bools в массиве 'rooms'? Это связано с тем, что я только хотел бы изменить непрозрачность UICollectionViewCell, которая соответствует ключевому слову, сохраняя все элементы в массиве. – provdr

0

Я кончался так:

static func toggleHidden(whichOne: String) { 
    for index in 0..<rooms.count { 
     if rooms[index].type == whichOne || rooms[index].position == whichOne { 
     !rooms[index].isHidden ? (rooms[index].isHidden = true) : (rooms[index].isHidden = false) 
     } 
    } 
    } 

Жаль, что я мог бы сделать его короче, но он просто работает. Таким образом, если я делаю self.collectionView?.reloadData(), CollectionView применяет изменения, как ожидалось.
Это основано на ваших советах, спасибо большое.

+0

Это, по сути, моя логика моего ответа. Я также предоставляю возможность сократить его с помощью 'filter'. Вы должны нажать галочку подтверждения принятия. – Mundi

+0

Я упростил свой код и проверил ваш код на игровой площадке, но все же он не компилируется ... [snapshot] (http://i.imgur.com/0IvxS03.jpg) – provdr