SwiftのiTunesUで「iphoneとipad用のios7アプリを開発する」からスタンフォードマッチイズモゲームを複製しようとしています。
3回目の講義 slides の77ページで、SwiftのオプションではないIBOutletCollection
を使用して示しています。 Swift docの例はIBOutlet
の配列を持つ1つの例を示していますが、Interface Builderで複数のアウトレットを同じIBOutlet
/IBOutlet
配列。
誰もまだこれを行う方法を考え出しましたか?
12のアウトレットを作成し、その方法で対処できることはわかっていますが、この作業を講義スライドの例に可能な限り近づけたいと思います。
編集
これは、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
更新:これは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)"
}
}
つかいます:
@IBOutlet var lineFields: [UITextField]!
次に、UITextField要素からlineFields
に順番にコントロールドラッグします。
@IBOutlet var buttons : [UIView]!
次に、インターフェイスビルダーの接続インスペクターまたはそのために通常使用する方法からドラッグします。
手順に従ってコンセントの配列を作成し、IB Elementsに接続します。
-
class ViewController2: UIViewController {
@IBOutlet var collection:[UIView]!
override func viewDidLoad() {
super.viewDidLoad()
}
}
この構文を使用してXcode Seed 3でこれを動作させました
@IBOutlet strong var views: NSArray?
ここで私の議論を参照してください: https://stackoverflow.com/a/24686602/341994
@machineが言ったことは、iOS 9バインディングの現在の状態(XCode 7.1)のようです。重要なのは、それらをすべて順番にドラッグすることです。最初の項目を使用して、Ctrlキーを押しながらコントローラーコードにドラッグし、[コンセント]タイプをコレクションに変更します。コントローラーコードファイルから、アウトレットポイントを順番に各スクリーンコントロールに1つずつドラッグします(@machineが言うように)