2016-05-05 10 views
0

私は "RunnerWindowController" 私のクラスでは、この機能を持っている:Swiftで返信せずにfuncを呼び出す方法は?

func didChangeScreenParameters(){ 
    runnerLayer.removeAllAnimations() 
    animateRunner() 
} 

私が使用して別のクラスのうち、機能を呼び出そう:私は、この致命的なエラーが発生します

var RunnerWindowC: RunnerWindowController! 

@IBAction func btnSenden(sender: AnyObject) { 
    RunnerWindowC.didChangeScreenParameters() 
} 

を:

fatal error: unexpectedly found nil while unwrapping an Optional value 

私は戻り値は必要ありませんが、関数の実行のみです。

EDIT:私は死ぬRunnerWindowControllerでINITを持っているので、回答の2016年5月13日

なしに役立ちません。

解決しようとする課題:

私はNSTimerの問題を解決しました。

RunnerWindowController:

var SetDidChange : Bool = false 

class RunnerWindowController{ 
var startvalue : CGFloat = 0 

var timer : NSTimer? 

func initTimer() { 
    self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: 
self, selector: #selector(refresh), userInfo: nil, repeats: true) 
} 

@objc func refresh() { 
    if (SetDidChange == true) { 
     print("Refresh done") 
     runnerLayer.removeAllAnimations() 
     animateRunner() 
     SetDidChange = false 
    } 
} 
.... 
} 

RunnerPrefController:括弧の

override func viewDidAppear() { 
    SetDidChange = false 
} 

@IBAction func btnSenden(sender: AnyObject) { 
    SetDidChange = true 
} 
+4

あなた 'RunnerWindowC'プロパティは暗黙的に開封されたオプションで、関数を呼び出すとき、' nil'あるようセグエで使用する(これはすべきダブルではなく単一の '()'で行うべきです - [このQ&A]を見てください(http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrappingオプションの値を安全に処理する方法の詳細については、「オプションの値」を参照してください)。 – Hamish

答えて

0

一方のセットが十分である - すなわち。 RunnerWindowC.didChangeScreenParameters()。しかし、おそらくRunnerWindowCがエラーになっているというエラーは、RunnerWindowCを割り当てていることを確認してください(例えば、あなたがセグリングしている場合はそれを渡してください)。

+0

"あなたがそれからセグエーしているなら、それを通り過ぎれば"肉で何をしますか? – Gazzari

0

問題は、初期化されていない変数でメソッドを呼び出そうとしている可能性があります。表示されたコードは、クラス変数を定義し、初期化しません。

let storyboard = UIStoryboard(name: "NameOfStoryboardFile", bundle: nil) 
self.RunnerWindowC = storyboard.instantiateViewControllerWithIdentifier("RunnerWindowController") as! RunnerWindowController 

EDIT 5-12:そのコントローラは、あなたがこのようにそれを初期化することができますストーリーボードに結合されている場合は

self.RunnerWindowC = RunnerWindowController() 

:いくつかの時点で、そのメソッドを呼び出す前に、あなたはこのようにそれを初期化する必要があります-16:

アプローチA:

が迅速にクラスレベルの変数を初期化するために、二つの主なアプローチがある

あなたが実装するイニシャライザは、あなたが継承するクラス に依存することに注意してください。他のクラスから継承している場合は、別の イニシャライザをオーバーライドする必要があります。たとえば、UIViewControllerから継承すると、 はinit()ではなくinit(coder :)メソッドをオーバーライドする必要があります。

class MyParentClass: NSObject { 
    var RunnerWindowC: RunnerWindowController! 

    init() { 
    RunnerWindowC = RunnerWindowController() 
    super.init() 
    // ^^^ All class variables need to be initialized 
    // before the call to super.init() in swift! 
    } 

    // If you were doing this in a class that inherits UIViewController 
    // you would implement the initializer like this instead: 
    /**** 
    required init?(coder aDecoder: NSCoder) { 
    RunnerWindowC = RunnerWindowController() 
    super.init(coder: aDecoder) 
    } 
    ****/ 

    @IBAction func btnSenden(sender: AnyObject) { 
    self.RunnerWindowC.didChangeScreenParameters() 
    } 
} 

アプローチB:

あなたにもこれを行うことができますので、スウィフトはまた、彼らはクラスレベルで定義されているとき、変数を初期化することができます:

class MyParentClass: NSObject { 
    var RunnerWindowC = RunnerWindowController() 

    @IBAction func btnSenden(sender: AnyObject) { 
    self.RunnerWindowC.didChangeScreenParameters() 
    } 
} 

私は正直ドン個人的な好み以外の技術的な違いがあるかどうかは分かりません。私は両方を使用して、問題がなかった。

+0

これを初期化する必要がありますか? 私はこのエラーが発生します:期待される宣言 そのコントローラでは、ストーリーボードが結合されていません。 – Gazzari

+0

ご存知ですか? – Gazzari

+0

@ gazzariそれはRunnerWindowControllerを作成するために「他のクラス」が必要とする方法に依存します。 RunnerWindowControllerはself.presentViewController()経由で呼び出されるポップアップですか?それともあなたのストーリーボード上のセグを介して表示されていますか?または、self.navigationController?.pushViewController()経由でナビゲーションビューコントローラにプッシュされますか? – JiuJitsuCoder

1

これを試してみてください。

class RunnerWindowController: UIViewController { 
    class func didChangeScreenParameters(){ 
     runnerLayer.removeAllAnimations() 
     animateRunner() 
    } 
} 

class yourClassName: UIViewController { 
    @IBAction func btnSenden(sender: AnyObject) { 
     RunnerWindowController().didChangeScreenParameters() 
    } 
} 
+0

私はそのエラーが表示されます: 'runnerWindowController'タイプのインスタンスメンバー 'didChangeScreenParameters'の使用 – Gazzari

+0

エラー:パラメータrunnerWindowの引数がありません – Gazzari

+0

@Gazzari try answer do answer – iParesh

0

試みが

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

let vc = segue.destinationViewController as? RunnerWindowController 
vc?.didChangeScreenParameters() 

} 
関連する問題