2016-09-15 3 views
6

私のコードは、WCSessionDelegateとしてマークされたクラスを持つXcodeの8WCSessionDelegate:sessionDidBecomeInactiveとsessionDidDeactivateが使用不能とマークされていますが、私はちょうどスウィフト3にスウィフト2アプリを変換

の変換機能を使用して、必要とされています。

スウィフト2では、方法なしでコンパイルしましたsessionDidBecomeInactivesessionDidDeactivateです。

Swift 3のバージョンをコンパイルすると、私のクラスがプロトコルWCSessionDelegateに準拠していないとコンパイラーが納得しています。これは明らかに正しいものです。
その後、両方の機能のためのスタブを挿入するために提供しています:

public func sessionDidBecomeInactive(_ session: WCSession) { } 
public func sessionDidDeactivate(_ session: WCSession) { } 

は、これらのスタブが挿入された後、これらのエラーが報告されています

Cannot override 'sessionDidBecomeInactive' which has been marked unavailable 
Cannot override 'sessionDidDeactivate' which has been marked unavailable 

がどのように私はこの問題を解決することができますか?

+0

'deactivate'と' inactive'コールバックを追加したクラスです。それがコンパイルされ、iOSアプリとWatchKit拡張の両方に使用されていますか? – ccjensen

+0

@ccjensen:はい、このクラスは共有されています。 –

+0

@ccjensen:クラスにwatch拡張子だけがターゲットとして存在する場合にも、問題が存在します。 –

答えて

19

代理人のメソッドsessionDidDeactivatesessionDidBecomeInactiveは、watchOSでは使用できないとマークされているため、コンパイラは共有クラスのコードを無視します。あなたは、次のプリプロセッサマクロを使用して行うことができます。

#if os(iOS) 
public func sessionDidBecomeInactive(_ session: WCSession) { } 
public func sessionDidDeactivate(_ session: WCSession) { 
    session.activate() 
} 
#endif 

をも私はsessionDidDeactivate呼び出しでactivateコールを追加しましたのでご注意ください。これは、ユーザーが1つのペアの時計から2つ目のペアの時計に切り替わったときに、電話機のセッションを再度アクティブにすることです。このように呼び出すと、切り替えが発生する前に時間を与えなければならないコードの一部または他のスレッドがないことが前提です。クイックウォッチ切り替えのサポートの詳細については、アップルをご覧ください。sample code

+0

努力していただきありがとうございますが、提案されたコードの改良によってコンパイラのエラーが解消されませんでした。 –

+0

私は自分の答えを更新しました。これを行ってください – ccjensen

+0

素晴らしい!できます!ありがとう。 –

関連する問題