2016-09-03 17 views
2

注:私はこれをほとんど分かっていませんでした。まだ混乱。はSwift 3/iOS 10でcontinueUserActivityをトリガーできません

私はSwift 3でXc8b6でNSUserActivity処理を実装しようとしていますが、ハンドラプロトコルメソッドのメソッドシグネチャに問題があります。現在のドキュメントで

、方法があると言われている。

func application(_ application: UIApplication, 
       continue userActivity: NSUserActivity, 
     restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

これはほんの少しだけ私は迅速ヘッダインタフェースに表示されるものとは異なります。そこでは、修復の戻り値のタイプがスウィフトです。無効です。

私はこれをしようとすると、私が手にエラーがある:

のObjective-Cメソッド 'アプリケーション:継続:restorationHandler:' をしません ':継続restorationHandlerは:)アプリケーション(_' メソッドによって を提供試合 要件のセレクタ (「アプリケーション:continueUserActivity:restorationHandler:」)

私は、コンパイラの警告が今大きくないですが、私はそれは、このためのObj-Cのメソッドシグネチャを見つけています意味するためにこれを取る実現しかし、どういうわけか私の議論全く合わない。

私はこれと一緒にどこに行くべきか分かりません。そこにあるものと一致しますが、何かが間違っています。ランダムな推測とチェックはまだ私を助けていない。

興味深いことに、オートコンプリートは私に異なるメソッドシグネチャを与える:この約1

public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool 

いいことは、それがコンパイルされることです。あまりうれしいことは、Spotlightからインデックスを作成したアイテムを選択してアプリを起動するときにトリガされないことです。

明らかに私のNSUserActionは正しくアプリケーションを識別して起動しました。私がここで紛失する可能性のあるものがありますか?復原を撃たないでしょうか?これは、iOS 9で正常に動作したプロジェクトから変換されていることに注意してください。

また、What's New With SearchのWWDCビデオでは、もう1つのバージョンのプロトコルメソッドシグネチャがあります。私はそれを試みたが、それはコンパイルされたが、どちらもトリガーしなかった。

スウィフト3の変換ツールを完了した後で、これを丸めて表示するだけのシグネチャです。これは、コンパイルされますが、スポットライトから起動したときにトリガされませんでした:

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool 

----更新-----

[OK]をクリックします。したがって、上記の最初のメソッドシグネチャは正しいものです。問題は、私がAppDelegateの拡張でそれを定義していたことです。これはSwift 2.xでうまくいきました。

私はそれを動かして、すべてうまくいきます。しかし、拡張からプロトコルメソッドを実装するときに、なぜこれらのコンパイルエラーが発生するのかをより深く理解したいと思います。それはもはやプロトコルの適合性を介して運ばれますか?拡張機能に追加しようとすると、重複していることを示すエラーが表示されるので、それはそれほど問題ではないと思います。

+0

プロトコル拡張に関数を追加する場合は、元のプロトコル定義内で関数を追加することと同等です。そのため、重複しているというエラーが表示されます。プロトコルエクステンションが特定のタイプのみの場合は、別のストーリーです – user1046037

+0

プロトコル拡張ではありませんでした。私は古い質問が答えられたので私は新しい質問を作成しなければならないでしょう。 簡潔に - 拡張はちょうどです: 拡張AppDelegate { 私はクラスを拡張していますが、プロトコルは拡張していません。 – jeffro37

答えて

2

元の質問は、なぜcontinueUserActivityが呼び出されなかったのか(そして正しい署名が何であったのか)であったため、ここでは何が間違っていたのかを明確にして答えます。

正しい署名は、私は私のポストの一番上に置くものです:

func application(_ application: UIApplication, 
       continue userActivity: NSUserActivity, 
     restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

に注意してください。この署名はオートコンプリートがXc8b6に提供するものと異なっているので、私は他の誰かがこの投稿と利益を打つかもしれない疑いこの応答。

私の最初の問題は、私が内線内から行っていたためにコンパイルされていなかったことです。

extension AppDelegate { 
    func application(_ application: UIApplication, 
        continue userActivity: NSUserActivity, 
        restorationHandler: @escaping ([Any]?) -> Void) -> Bool { 
    return true 
    } 
} 

これは古いiOS 9/Swift 2.xプロジェクト(古いcontinueUserActivity署名付き)で機能しました。私はまだ肯定的ではありませんが、Xc8/Swift 3の拡張モジュールではコンパイルされません。

私はそれをクラススコープに移動しました。

+0

私はAppDelegateのオプションのメソッドで同じ問題を引き起こしています。拡張機能ではもうビルドしません。これは非常に面倒で、AppDelegateを非常に汚くします。私はfuncがfileprivateのようなスコープを持っている可能性があると思いますか?拡張機能はそれらを見ることができません –

+0

@ jeffro37あなたの署名は私にエラーを与えています。スイフトを使用して4。 – Jonny

0

したがって、Swift 3から始めると、プロトコルメソッドは、プロトコルがクラスにアタッチされているスコープ内でしかアクセスできないように見えます。

あなたはメソッドにアクセスしようとすると、これはプロトコル内UIApplicationDelegateあるAppDelegateのすべての方法がUIApplicationDelegateクラスAppDelegate中またはに準拠AppDelegateの延長にのみアクセス可能であることを

を意味し、あなたがコンパイルできないUIApplicationDelegateに準拠しているそのクラス/エクステンション外のUIApplicationDelegateの

関連する問題