2016-05-03 10 views
1

私は例えば、多くのUILabelsとUIImageViewsが含まれていスウィフト(XCodeの6.4)でアプリを書いている:スウィフト:動的UIオブジェクトをターゲットに - UILabels、UIImageViews

@IBOutlet weak var image1: UIImageView! 
@IBOutlet weak var image2: UIImageView! 
@IBOutlet weak var image3: UIImageView! 

@IBOutlet weak var label1: UILabel! 
@IBOutlet weak var label2: UILabel! 
@IBOutlet weak var label3: UILabel! 
//many more 

私はその関数を記述することができるようにしたいです動的に単純にパラメータを渡すことにより、ラベルやイメージビューをターゲットにすることができます:

func setImage (num: Int) { 
let imageView = "image" + String(num) 
imageView.image = "myGraphicName" 
} 

ImageViewの定数は、このような「画像3」のように単なる文字列であると明らかにこれは動作しません。では、名前に基づいてUIオブジェクトをどのようにターゲットに設定しますか? ActionScriptには次のようなものがありました:

eval["nameofobject"].width = 125; 

これはオブジェクトにリンクされ、そのメソッドとパラメータにアクセスできるようになりました。

ご協力いただきありがとうございます。

kw。

答えて

1

特定のアイテムを番号でターゲティングする必要がある場合、1つの方法は、番号付けスキームを設計し、名前の代わりにタグを使用することです。

例えば、UIImageViewは1000から始まり、すべてUILabelは2000から始まり、すべてUIButtonは3000から始まります。代わりにこれらのタグと

、次のようにあなたの関数を書き換える:

func setImage (tag: Int) { 
    let imageView = self.view.viewWithTag(tag) as! UIImageView 
    imageView.image = UIImage(named:"myGraphicName") 
} 

あなたがループ内で項目のグループに対処したい場合は、代わりに@IBOutletCollectionを使用することができます。アウトレットコレクションを作成し、目的のUIImageViewオブジェクトを追加します。すべてのUIImageViewオブジェクトで同じアクションを実行する必要がある場合は、@IBOutletCollectionのすべてのアイテムをfor-eachループでループします。

+0

感謝を。 UIImageViewにタグ値を設定するにはどうすればよいですか? – Kwangle

+0

@Kwangleインターフェースビルダーであなたの 'UIImageView'をクリックし、属性ビューアを選択し、' View'までスクロールし、タグ値を 'Tag'フィールドのエディタに入力します。 – dasblinkenlight

+0

あなたの助けてくれてありがとう、これは私が探しているものですが、うまくいきません。 line:imageView.image = "myGraphicName"は、StringをUIImageViewオブジェクトに割り当てることができないというエラーを投げています。 – Kwangle

2

スウィフトとオブジェクティブ-C key-value observing(これに言及すると@rmaddyのクレジット)とObjective-C selectorsです。多くの同様のビューがあると言いますから、それらを配列に入れて、配列を通って、それぞれに必要なことをするだけです。このような配列は、ストーリーボードから直接作成できます。配列内のビューを選択してConnections inspectorに行き、ctrl + Referencing outlet collectionをドラッグして新しい配列を作成し、同様の方法で同じ配列内の他のビューをCtrl +ドラッグします。

+0

実際、SwiftとObjective-Cにはこの機能があります。これは、Cocoa/Cocoaのタッチフレームワークによって提供されています。これはKey-Value Coding(KVC)として知られています。 [件名に関する全文](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html#//apple_ref/doc/uid/10000107i)があります。 – rmaddy

+0

さて、KVOはセレクタよりも優れていますが、何かを見逃していない場合は、まだ初期のオブジェクトが必要です。ここでKVOを使用して私のためのメモとして50セントの問題のための万ドルのソリューションのように思える。 – Jelly

+0

私はKVOがこの特定の質問の良い解決策であると言っているわけではありません。私は答えの最初の部分を反論しています。 – rmaddy

0

その他の回答、Objective-Cランタイム可視タイプのクエリのための両方の実用的なアプローチに記載されているタグのうち、標準ライブラリの一部であるSwift reflection type Mirrorを使用して、ランタイム中にオブジェクトのプロパティをクエリすることもできます。 。スウィフト反射アプローチを使用する

利点は、(私の例では、このことを実証するために、任意の構造体ABCを使用して)それはあなたのスウィフトコードで可視Objective-Cのタイプのためにだけでなく、純粋スイフトタイプのために働くことです。

struct A { 
    let state:String 
} 

struct C {} 

struct B { 
    let x1:A 
    let y1:A 
    let z2:C 

    var propertyValuesOfTypeC:[C] { 
     let mirror = Mirror(reflecting: self) 
     return mirror.children.filter({ $0.value is C }).map({ $0.value as! C }) 
    } 

    func propertyValues(suffix s:String, type:Any.Type) -> [Any] { 
     let mirror = Mirror(reflecting: self) 
     return mirror.children.filter({ $0.label!.hasSuffix(s)}).map({ $0.value as! A }) 
    } 
} 

let b = B(x1:A(state:"foo"), y1:A(state:"bar"), z2:C()) 

print(b.propertyValues(suffix:"1", type: A.self)) 
print(b.propertyValuesOfTypeC) 

これは出力し:あなたは助けるため

[A(state: "foo"), A(state: "bar")] 
[C()] 
関連する問題