Swift - эквивалент IBOutletCollection
Я пытаюсь воспроизвести игру "Стэнфордский матчизм" из раздела "Разработка приложений ios7 для iphone и ipad" в iTunesU в Swift.
На странице 77 3-го слайда лекции он показывает, используя IBOutletCollection
что не вариант на Swift. Пример документа Swift показывает один пример, который имеет массив IBOutlet
, но я не могу понять, как заставить Interface Builder подключать несколько розеток к одному IBOutlet
/IBOutlet
Массив.
Кто-нибудь еще разобрался, как это сделать?
Я знаю, что могу создать 12 торговых точек и справиться с этим таким образом, но я бы хотел сделать эту работу максимально приближенной к примеру на слайдах лекции.
7 ответов
РЕДАКТИРОВАТЬ
Это было исправлено в более поздней бета-версии Swift - теперь есть опция IBCollection в конструкторе интерфейсов.
Для ранних бета-версий Swift:
Я столкнулся с той же проблемой: в примечаниях к выпуску Beta 2 вы найдете следующее утверждение:
Интерфейсный Разработчик не поддерживает объявление коллекций розеток в классах 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
Обновление: это работает должным образом в XCode теперь - "Outlet Collection" - один из вариантов соединения в Интерфейсном Разработчике, который создает что-то похожее на:
@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)"
}
}
Использование:
@IBOutlet var lineFields: [UITextField]!
Затем перетащите элемент управления из элементов UITextField в lineFields
с целью.
@IBOutlet var buttons : [UIView]!
затем перетащите его из инспектора соединений в конструктор интерфейса или любой другой метод, который вы обычно используете для этого
Выполните шаги, чтобы создать массив торговых точек и связать его с IB Elements:
- Создать массив IBOutlets
- Добавьте несколько UIElements (Views) в интерфейс Storyboard ViewController (как показано на снимке ниже)
- Выберите ViewController (в раскадровке) и откройте инспектор соединений
- В инспекторе соединений есть опция "Коллекции розеток" (там вы увидите массив розеток)
- Подключите, если с вашими элементами интерфейса
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
Я получил это работает в Xcode seed 3, используя этот синтаксис
@IBOutlet strong var views: NSArray?
Смотрите мое обсуждение здесь: /questions/36507301/ne-mogu-podklyuchit-kollektsiyu-rozetok-v-xcode-6-ispolzuya-raskadrovku/36507311#36507311
То, что сказал @machine, похоже, является текущим состоянием (XCode 7.1) с привязками iOS 9. Ключ, чтобы перетащить их все по порядку. Используйте первый элемент для управления + перетащите в код контроллера, а затем измените тип розетки на коллекцию. После файла кода контроллера перетащите точку выхода на каждый элемент управления экрана по порядку (как говорит @machine).