2016-08-13 28 views
0

の間には、共通のスーパーをだからここことだ、私はこのようなプロパティを宣言しています:コンピュー変数とSnapkitを使用しない場合:ビュー

var aNameLabel: UILabel { 
    guard let foo = Applicant.sharedInstance.realName else { 
     return UILabel(text: "获取姓名失败", color: .whiteColor()) 
    } 
    return UILabel(text: foo, color: .whiteColor()) 
} 

そして私は、私はsomeView.addSubView(aNameLabel)をした後aNameLabelに制約を追加しようとすると、

let aNameLabel = UILabel(text: "Allen", color: .whiteColor())

:私はこのようなLET定数に変数を変更すると、アプリは、この制約-追加する事で毎回クラッシュし、しかし No common superview between views

を言うだろう

制約が追加され、苦情はありません。誰かがこれで私を助けることができますか? @parの助けを借りて

UPDATE

、私はこれに私のコードを変更しました:

var aNameLabel: UILabel = { 
    guard let foo = Applicant.sharedInstance.realName else { 
     return UILabel(text: "BAD", color: .whiteColor()) 
    } 
    return UILabel(text: foo, color: .whiteColor()) 
}() 

ながら実際に私のguard letそしてaNameLabelは常に、値が「BAD」が割り当てられます成功です。これをどうやって解決するのですか?

答えて

1

aNameLabel変数にアクセスするたびに新しいUILabelを作成しているという問題があります(計算プロパティー関数は、アクセスするたびに実行されます)。おそらく、あなたはこのビューのスーパービューについて同じことをしているでしょう(上記の例ではにsomeView.addSubview()でアクセスしています)。もしそうなら、それは共通のスーパービューがなく、クラッシュしている理由です。

あなたはあなたのビューコントローラによって使用される各UIViewのインスタンスを1つだけ作成する必要がありますので、あなたはを示してきたように定数として変数を作成する偉大なアプローチである、またはあなたがそうのような閉鎖 - 初期化子パターンを使用することができます。

var aNameLabel: UILabel = { 
    return UILabel(...) 
}() 

上記の例では、閉じ括弧の後のかっこが注目されています。これはclosure-initializerなので、let定数のように一度だけ呼び出されます。

多くの場合、一定の性質がinit()を返す前に初期化する必要があるためletで作成UIViewは適切ではない、とあなたはビューコントローラでビューを作成している場合は、loadView()までビューを追加する機会が呼び出されていません。 。この場合、UIViewを暗黙的にアンラップされたオプションとして宣言してください。

class MyViewController: UIViewController { 
    var someSubview: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     someSubview = UIView() 
     view.addSubview(someSubview) 
     // now set constraints with SnapKit 
    } 
} 
+0

おかげでメイト:彼らはviewDidLoad()は、例えば、呼び出されたとき、あなたは後で、実際の景色にそれらを設定することができ、初期化の要件を満たしているinit()によってnilに設定されます!これは本当に助けになった!しかし、私はまだこれについて問題があります。私の質問の更新をお読みください。 – Allen

+0

ちょっと私はそれを更新しました – Allen

+0

こんにちは、私はちょうど 'viewDidLoad()'の値を初期化することを選択しました。問題は解決しました。私はちょうど私の 'viewDidLoad()'がより簡単で、変数が宣言されているときに変数rightに代入したいと思っていました。 – Allen

関連する問題