Подтвердить что ты не робот

Swift - эквивалент IBOutletCollection

Я пытаюсь воспроизвести игру Stanford Matchismo из "Разработка приложений ios7 для iphone и ipad" в iTunesU в Swift.

На стр. 77 3-й лекции слайды, она показывает использование IBOutletCollection, которое не является опцией в Swift. В примере примера Swift показан один пример с массивом IBOutlet, но я не могу понять, как заставить Interface Builder подключать несколько выходов к тому же массиву IBOutlet/IBOutlet.

Кто-нибудь понял, как это сделать?

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

4b9b3361

Ответ 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