web-dev-qa-db-ja.com

Swift-IBOutletCollectionと同等

SwiftのiTunesUで「iphoneとipad用のios7アプリを開発する」からスタンフォードマッチイズモゲームを複製しようとしています。

3回目の講義 slides の77ページで、SwiftのオプションではないIBOutletCollectionを使用して示しています。 Swift docの例はIBOutletの配列を持つ1つの例を示していますが、Interface Builderで複数のアウトレットを同じIBOutlet/IBOutlet配列。

誰もまだこれを行う方法を考え出しましたか?

12のアウトレットを作成し、その方法で対処できることはわかっていますが、この作業を講義スライドの例に可能な限り近づけたいと思います。

48
Alcanzar

編集

これは、Swift-の今後のベータリリースで修正されました-インターフェイスビルダーのIBCollectionオプションにあります。


Swiftの初期ベータリリースの場合:

私は同じ問題に出くわしました。ベータ2のリリースノートには、次の記述があります。

Interface 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 to Swift

9
apotry

更新:これはXcodeで正常に動作するようになりました-「アウトレットコレクション」はInterface Builderの接続オプションの1つで、次のようなものを作成します。

@IBOutlet var labelCollection: [UILabel]!

修正を待っている間、計算されたプロパティを使用してこれを概算できます。私のビューには、コレクションに必要なUILabelsが5つあるとしましょう。それでもそれぞれを宣言する必要がありますが、それらを収集する計算プロパティも宣言します。

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)"
    }
}
80
Nate Cook

つかいます:

@IBOutlet var lineFields: [UITextField]!

次に、UITextField要素からlineFieldsに順番にコントロールドラッグします。

21
machine
@IBOutlet var buttons : [UIView]!

次に、インターフェイスビルダーの接続インスペクターまたはそのために通常使用する方法からドラッグします。

13
ZiggyST

手順に従ってコンセントの配列を作成し、IB Elementsに接続します。

  • IBOutletsの配列を作成する
  • Storyboard ViewControllerインターフェースに複数のUIElement(ビュー)を追加します(以下のスナップショットに示すように)
  • ViewController(ストーリーボード内)を選択し、接続インスペクターを開きます
  • 接続インスペクターにオプション「アウトレットコレクション」があります(そこにはアウトレットの配列が表示されます)
  • インターフェイス要素でifを接続します

-

class ViewController2: UIViewController {


    @IBOutlet var collection:[UIView]!


    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

enter image description here

4
Krunal

この構文を使用してXcode Seed 3でこれを動作させました

@IBOutlet strong var views: NSArray?

ここで私の議論を参照してください: https://stackoverflow.com/a/24686602/341994

2
matt

@machineが言ったことは、iOS 9バインディングの現在の状態(XCode 7.1)のようです。重要なのは、それらをすべて順番にドラッグすることです。最初の項目を使用して、Ctrlキーを押しながらコントローラーコードにドラッグし、[コンセント]タイプをコレクションに変更します。コントローラーコードファイルから、アウトレットポイントを順番に各スクリーンコントロールに1つずつドラッグします(@machineが言うように)

1
Krams