2016-09-16 4 views
10

iOSのクイックアクション/ショートカットアイテムは、アプリケーションデリゲートの実装application(_:performActionFor:completionHandler:)によって受信されます。iOSのクイックアクション(ショートカットアイテム)では、完了ハンドラパラメータの目的は何ですか?

この実装では、completionHandlerを呼び出すことになっています。それはブールを取る。

ブールが何であるか知っていますか?私はtruefalseを渡すかどうかにかかわらず違いはありません。 (実際に、私は私がcompletionHandlerを呼び出すために無視しても何の違いを見ていない!)

短い答え
+0

あなたは文書を通過しましたか? [application:performActionForShortcutItem:completionHandler](https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622935-application?language=objc) –

+1

@AdilSoomroはい、持っています。あなたは? – matt

+0

私は間違っている可能性がありますが、私はあなたがメソッドの実装を担当し、そのメソッドを条件付きで呼び出す責任があると思います。この場合、 'completionHandler'(実装する責任者)も渡すことができます。アプリケーション(_:performActionFor:completionHandler:) 'あなたは' completionHandler'で実装したロジックに意味をなさないブールを渡すことができ、ビルドしたいものの設計に従います。 –

答えて

5

:パラメータはiOSの10のブロックの実装で使用されていないが(推測それもiOSの9、しかしにすることはできません今すぐチェックしてください)。

長い答え:私はIntel64でこれを実行するので、私たちはARCの下にブロックを呼び出すときに最初の引数は(rdiレジスタに格納されなければならないことがある

___50-[UIApplication _handleApplicationShortcutAction:]_block_invoke: 
push  rbp        ; XREF=-[UIApplication _handleApplicationShortcutAction:]+132 
mov  rbp, rsp 
mov  rax, qword [ds:rdi+0x20] 
mov  rdx, qword [ds:rdi+0x28] 
mov  rsi, qword [ds:0x1179e88]   ; @selector(_updateSnapshotAndStateRestorationWithAction:) 
mov  rdi, rax       ; argument "instance" for method imp___got__objc_msgSend 
pop  rbp 
jmp  qword [ds:imp___got__objc_msgSend] 
; endp 

:さんはcompletionブロックの内部で何が起こるか見てみましょうNSMallocBlockのインスタンス)。セレクタがないので、2番目のパラメータ(bool引数)はrsiレジスタに格納する必要があります。しかし、rsiレジスタはコードでは使用されていません - という引数でオブジェクトds:rdi+0x20にメッセージ_updateSnapshotAndStateRestorationWithAction:を送信するだけです。

ds:rdi+0x20ds:rdi+0x28の両方がブロック内にキャプチャされたポインタです。

スナップショット機能の指標としてパラメータを使用した推測が間違っていると考えてください。

+0

これとあなたの[生産のUIViewAlertForUnsatisfiableConstraintsをキャッチ](http://stackoverflow.com/a/39238104/2415822)の回答は信じられないほどです。私はこのようにUIKitをリバースエンジニアリングすることができればと思っています。 – JAL

+0

@JALありがとう! –

+0

スナップショットでこれをどのように使用するのだろうと思います。それは打ち上げイメージと関係しなければならない。私たちが 'false'を返すと、私たちは中断されて前面に来て、バックグラウンド時に取ったスナップショットを使用すると推測しています。私たちはインターフェースを変更しないと言っているからです。しかし、 'true'を返すと、ランタイムは元の起動イメージに戻ります。そんな感じ...?しかし、私があなたを正しく理解するならば、実際には結局その決定をしないと言っているのです。 – matt

関連する問題