Swift - эквивалент IBOutletCollection
Я пытаюсь воспроизвести игру Stanford Matchismo из "Разработка приложений ios7 для iphone и ipad" в iTunesU в Swift.
На стр. 77 3-й лекции слайды, она показывает использование IBOutletCollection
, которое не является опцией в Swift. В примере примера Swift показан один пример с массивом IBOutlet
, но я не могу понять, как заставить Interface Builder подключать несколько выходов к тому же массиву IBOutlet
/IBOutlet
.
Кто-нибудь понял, как это сделать?
Я знаю, что я могу создать 12 торговых точек и разобраться с ними таким образом, но я хотел бы сделать эту работу как можно ближе к примеру на слайдах лекций.
Ответы
Ответ 1
ИЗМЕНИТЬ
Это было исправлено в более поздней версии бета-версии Swift - теперь IBCollection в конструкторе интерфейса.
Для ранних бета-версий Swift:
Я столкнулся с одной и той же проблемой: в примечаниях к выпуску Beta 2 вы найдете следующее утверждение:
Интерфейс Builder не поддерживает объявление коллекций выпускников в классах Swift
Я решил это следующим образом (легко настроить):
class CardGameViewController: UIViewController {
@lazy var cardButtons : UIButton[] = {
var tempBtn: UIButton[] = []
for v:AnyObject in self.view.subviews {
if v is UIButton {
tempBtn.append(v as UIButton)
}
}
return tempBtn
}()
...
В основном, он просматривает все подзоны и проверяет, является ли он UIButton. В этом случае он добавляется во временный массив. Этот временный массив затем используется для ленивого создания массива cardButtons. Для всех деталей проверьте: Matchismo: Objective-C для Swift
Ответ 2
Обновление: Теперь это правильно работает в Xcode - "Outlet Collection" - это одна из параметров подключения в Interface Builder, которая создает что-то похожее:
@IBOutlet var labelCollection: [UILabel]!
Пока мы ждем исправления, вы можете приблизиться к этому, используя вычислимое свойство. Скажем, мой взгляд имеет пять UILabels
, которые я хочу в коллекции. Я все еще должен объявить каждый, но затем я также объявляю вычисленное свойство, которое их собирает:
class MyViewController {
@IBOutlet var label1 : UILabel
@IBOutlet var label2 : UILabel
@IBOutlet var label3 : UILabel
@IBOutlet var label4 : UILabel
@IBOutlet var label5 : UILabel
var labels: UILabel![] { return [label1, label2, label3, label4, label5] }
Вид раздражает, но с этого момента мы можем относиться к свойству labels
, как если бы это был IBOutletCollection
, и не придется менять остальную часть нашего кода после исправления ошибки:
override func viewDidLoad() {
super.viewDidLoad()
for (index, item) in enumerate(self.labels) {
item.text = "Label #\(index)"
}
}
Ответ 3
Использование:
@IBOutlet var lineFileds : [UITextField]!
Затем управляйте перетаскиванием элементов TextField в lineFileds
по порядку.
Ответ 4
@IBOutlet var buttons : [UIView]!
затем перетащите его из инспектора соединений в построитель интерфейса или какой-либо метод, который вы обычно используете для этого
Ответ 5
Я получил эту работу в семестре Xcode 3, используя этот синтаксис
@IBOutlet strong var views: NSArray?
Смотрите мою дискуссию здесь: fooobar.com/questions/122387/...
Ответ 6
То, что @machine говорит, похоже, является текущим состоянием (XCode 7.1) с привязками iOS 9.
Ключ должен привести их в порядок.
Используйте первый элемент для управления + перетаскиванием в код контроллера, а затем измените тип Outlet на коллекцию. После того, как из файла кода контроллера перетащите точку вывода на каждое из элементов управления экраном по порядку (как говорит @machine)
Ответ 7
Выполните шаги для создания массива точек и соедините его с IB Elements:
- Создайте массив IBOutlets
- Добавить несколько UIElements (Views) в вашем интерфейсе ViewController для раскадровки (как показано ниже)
- Выберите ViewController (в раскадровке) и инспектор открытых подключений
- В инспекторе соединений есть опция "Коллекции Outlet" (вы увидите там массив торговых точек)
- Подключить, если с элементами интерфейса
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
![enter image description here]()