2017-08-02 5 views
0

watchOS接続アプリケーションを作成して動作します。今、iPhoneとWatchでConnection専用のクラスを作ろうとしています。 iPhoneの接続クラスのために私が持っているこの(私もデータを転送するための他の方法を持っていますが、問題はここにある):予期せず迅速な時計接続が終了する

import UIKit 
import WatchConnectivity 

class iPhoneConnectivity: UIViewController, WCSessionDelegate { 

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 

    } 

    func sessionDidBecomeInactive(_ session: WCSession) { 

    } 

    func sessionDidDeactivate(_ session: WCSession) { 

    } 

    var session : WCSession!; 

    func getPrepared() { 
     if (WCSession.isSupported()) { 
      // check if the watch connectivity is suported on device 
      self.session = WCSession.default; 
      self.session.delegate = self; 
      self.session.activate(); 
     } else { 
      print("Session is not supported") 
     } 
    } 
} 

問題は、私は

connect.getPrepared(); 
のViewController

でこのメソッドを呼び出すしようとすると、

アプリケーションが予期せず終了します。

私はグローバル変数

var connect: iPhoneConnectivity!; 

は、私は、接続変数を初期化しなかったためということですか?それが問題なら、どのように初期化する必要がありますか?働く元のアプリケーションでは、

、私はgetPrepared()問題がconnectが暗黙のうちに開封されたオプションで、あなたが実際に初期化せず、それに関数を呼び出すことである

+1

あなたの質問を編集して、コールビューコントローラからiPhoneConnectivityをどのように/初期化するかを表示できますか?私はあなたが 'connect.getPrepared()'を呼び出す前に起こらなければならないと仮定します。また、Swiftでは、コードの各行の後にセミコロン( ";' ')を置く必要はありません(セミコロンはObjective-Cでなければなりません)。 –

+1

@MichaelDautermannが既に言っていることに加えて、あなたのクラスは 'UIViewController'から継承するべきではないと思います。 'MVC'デザインパターンに続いて、このクラスはModelクラスでなければならず、したがって、UI関連のタスクから完全に独立している必要があります。あなたのクラスにUI関連のコードも表示されないので、 'UIViewController'を継承しても意味をなさないので必要ありません。さらに、このようなクラスでは、シングルトンとして「iPhoneConnectivity」を作成する方が良いアプローチだと思います。 –

+0

私は変数 'c​​onnect'を初期化しないでください。私は静的な方法でそれを行うことはできないので、関数getPrepared()を呼び出すために使用します。私はiPhoneConnectivityはモデルクラスでなければならないことを知っていますが、UIViewControllerから継承を停止するとエラーが発生します。 セミコロンはオプションであることも知っていますが、私はこのように好きです。 しかし、私はUIViewcontrollerフォームを継承しているという事実は私が持っている問題でしょうか?私はエラーがない、アプリはコンパイルされているが、かなり予期せず。 –

答えて

0

のViewControllerのメソッドdidLoad()のメソッドのこのコードを持っていますそれ。暗黙のうちにラップされていないオプションは引き続き選択肢です。したがって、それらの値を与えないと、デフォルトではゼロになります。したがって、最初にゼロ以外の値を指定せずにアクセスしようとすると、実行時例外が発生します。

グローバル変数ではなく、シングルトンとしてconnectを定義します。

class iPhoneConnectivity: WCSessionDelegate { 

    static let sharedInstance = iPhoneConnectivity() 

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {} 

    func sessionDidBecomeInactive(_ session: WCSession) {} 

    func sessionDidDeactivate(_ session: WCSession) {} 

    var session : WCSession!; 

    func getPrepared() { 
     if (WCSession.isSupported()) { 
      // check if the watch connectivity is suported on device 
      self.session = WCSession.default; 
      self.session.delegate = self; 
      self.session.activate(); 
     } else { 
      print("Session is not supported") 
     } 
    } 
} 

あなたはiPhoneConnectivity.sharedInstanceを使用してアクセスしてiPhoneConnectivity.sharedInstance.getPrepared()を使用してgetPrepared()を呼び出すことができます。

+0

ありがとう、それは今動作します。 –

+0

うれしい私は助けることができました。私の答えが役に立ったら、それを答えとして受け入れてください。 –

関連する問題