2016-08-19 5 views
3

を初期化される前に、私はクラスにスイフト。メソッド呼び出しの「自己」の使用保存されているすべてのプロパティが

class ChartView: UIView 
{ 
    class: DotView { 
    let circleView1: UIView 
    let circleView2: UIView 

    init (view: UIView) 
    { 
     self.view = view 
     self.circleView1 = self.buildCircle(some rect here) 
     self.circleView2 = self.buildCircle(some rect here) 

    func buildCircle(rect: CGRect) -> UIView 
    { 
     let dotView = UIView(frame: rect) 
     dotView.backgroundColor = UIColor.whiteColor() 
     dotView.layer.cornerRadius = dotView.bounds.width/2 
     self.view.addSubview(dotView) 
     return dotView 
    } 
    } 
} 

を持っている。しかし、私はこのエラーを得た:保存されているすべてのプロパティがある前に、メソッド呼び出し「buildCircle」の「自己」の 使用を

私はちょうどいくつかの方法でオブジェクトを作成し、それを保存されたプロパティに割り当てたいだけです。コードを修正するにはどうすればよいですか?

+0

あなたの 'init'には閉じ括弧がないと思いますが、あるいは' buildCircle'が初期化子の内部にあると思いますか? –

答えて

7

あなたは上のメソッドを呼び出すことはできませんすべての非オプションのインスタンス変数が初期化される前にselfを実行します。 これを回避する方法はいくつかあります。 optionalsまたは暗黙的に開封されたoptionals (推奨されません)

  • ファイル内の静的メソッドbuildCircle()またはちょうど 機能を作成し、プロパティのすべての後 があったすべての円のためaddSubview()を呼び出すに

    1. 変更プロパティ super.init()
    2. などです。 クラスが初期化される前に、自分の呼び出しを避けるだけで済みます。
  • 0

    サークルビューは、willMoveToSuperviewで作成できます。この問題を解決するために

    override func willMoveToSuperview(newSuperview: UIView?) { 
         self.circleView1 = self.buildCircle(some rect here) 
         self.circleView2 = self.buildCircle(some rect here) 
    } 
    
    +0

    申し訳ありません。入れ子クラスを追加するのを忘れてしまいました。私は私の質問を編集しました。 –

    +0

    私のチャートビューでは、このチャートに関連するドットを作成したいので、チャートビューのビューをドットビューコンポーネントに挿入するだけですが、DotView外で作成したドットのフレームを変更する機能が必要ですクラス –

    +0

    @MatrosovAlexanderクラス関数 –

    2

    これらのアプローチを使用することが可能です:ので、あなたはChartViewが適切に割り当てられていて確実である。このライフサイクル機能で

    class MyClass: NSObject { 
        var prop: String = "" 
    
        override init() { 
         super.init() 
         self.setupMyProperty() 
        } 
    
        func setupMyProperty() { 
         prop = "testValue" 
        } 
    } 
    
    
    class MyClass1: NSObject { 
        var prop: String = "" 
    
        override init() { 
         prop = MyClass1.setupMyProperty() 
         super.init() 
        } 
    
        class func setupMyProperty() -> String{ 
         return "testValue" 
        } 
    } 
    
    +0

    私は文字列の代わりにオブジェクトで同じことを行うことができない –

    関連する問題