2016-09-16 6 views
10

ऐप प्रतिनिधि के application(_:performActionFor:completionHandler:) के कार्यान्वयन द्वारा एक आईओएस त्वरित कार्रवाई/शॉर्टकट आइटम प्राप्त होता है।आईओएस त्वरित कार्रवाई (शॉर्टकट आइटम) के साथ, पूरा करने वाले हैंडलर पैरामीटर का उद्देश्य क्या है?

उस कार्यान्वयन में, आपको completionHandler पर कॉल करना होगा। यह एक बूल लेता है।

क्या किसी को पता है कि बूल क्या है? मुझे true या false पास करने के बावजूद कोई अंतर नहीं दिखता है। (वास्तव में, मैं कोई अंतर नहीं है, भले ही मैं completionHandler कॉल करने के लिए उपेक्षा देखो!)

+0

क्या आप डॉक्टर के माध्यम से गए हैं? [आवेदन: performActionForShortcutItem: completHandler] (https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622935- appplication?language=objc) –

+1

@AdilSoomro हाँ, मेरे पास है। क्या तुम? – matt

+0

मैं गलत हो सकता हूं लेकिन मुझे लगता है कि आप विधि के कार्यान्वयन के लिए ज़िम्मेदार हैं और इस तरह की विधि को सशर्त रूप से कॉल करने के लिए ज़िम्मेदार भी हैं, इस मामले में आप 'समापन हैंडलर' (लागू करने की आपकी ज़िम्मेदारी भी) पास कर सकते हैं, इसलिए ' आवेदन (_: performActionFor: completHandler:) 'आप एक बूल पास कर सकते हैं जो कि' completHandler' पर लागू तर्क को समझ सकता है और जो आप बनाना चाहते हैं उसके डिज़ाइन पर निर्भर है। –

उत्तर

5

लघु जवाब: पैरामीटर आईओएस 10 में ब्लॉक के कार्यान्वयन में नहीं किया जाता है (लगता है कि आईओएस 9 भी, लेकिन में नहीं कर सकते अभी जांचें)।

लांग जवाब: चलो देखते हैं कि क्या completion ब्लॉक के अंदर होता है:

___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 

मैं Intel64 पर इस चलाते हैं, तो पहला तर्क rdi रजिस्टर में संग्रहित किया जाना चाहिए (जब हम एआरसी के तहत ब्लॉक बुला यह एक है NSMallocBlock का उदाहरण)। कोई चयनकर्ता नहीं है, इसलिए दूसरा पैरामीटर (बूल तर्क) rsi रजिस्टर में संग्रहीत किया जाना चाहिए। लेकिन कोड में rsi रजिस्टर का उपयोग नहीं किया जाता है - यह _updateSnapshotAndStateRestorationWithAction: पर संदेश ds:rdi+0x20 पर ds:rdi+0x28 तर्क के साथ संदेश भेजता है।

ds:rdi+0x20 और ds:rdi+0x28 दोनों ब्लॉक के अंदर पॉइंटर्स पर कब्जा कर रहे हैं।

सोचें कि स्नैपशॉट फ़ंक्शन के लिए पैरामीटर के रूप में पैरामीटर के साथ अनुमान गलत था।

+0

यह और आपका [उत्पादन में UIViewAlertForUnsatisfiableConstraints पकड़ें] (http://stackoverflow.com/a/39238104/2415822) उत्तर अविश्वसनीय हैं। मैं इस तरह इंजीनियर इंजीनियर UIKit करने में सक्षम होना पसंद करेंगे। – JAL

+0

@JAL धन्यवाद! –

+0

मुझे आश्चर्य है कि यह स्नैपशॉट के साथ इसका उपयोग कैसे करेगा। इसे लॉन्च छवि के साथ करना होगा।मैं अनुमान लगा रहा हूं कि अगर हम 'झूठी' वापस आते हैं, और हमें निलंबित कर दिया गया था और अब सामने आ रहा है, तो रनटाइम पृष्ठभूमि समय पर स्नैपशॉट का उपयोग करता है, क्योंकि हम कह रहे हैं कि हम अपना इंटरफ़ेस नहीं बदलेंगे। लेकिन अगर हम 'सत्य' वापस करते हैं, तो शायद रनटाइम मूल लॉन्च छवि पर वापस आ जाता है। ऐसा कुछ...? लेकिन अगर मैं आपको सही ढंग से समझता हूं, तो आप कह रहे हैं कि वास्तव में यह निर्णय लेने के बाद _doesn't_ नहीं करता है। – matt

संबंधित मुद्दे