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).

Другие вопросы по тегам