2013-08-04 3 views
8

मैं एक ओएस एक्स एप्लिकेशन पर काम कर रहा हूं जो सभी कनेक्टेड डिस्प्ले के सभी उपलब्ध रिक्त स्थान पर कस्टम विंडो प्रदर्शित करता है। मैं [NSScreen स्क्रीन] को कॉल करके उपलब्ध प्रदर्शन ऑब्जेक्ट्स की एक सरणी प्राप्त कर सकता हूं।डिस्प्ले कनेक्ट होने या डिस्कनेक्ट होने पर अधिसूचना

जो मैं वर्तमान में याद कर रहा हूं वह यह बताने का एक तरीका है कि उपयोगकर्ता अपने सिस्टम से स्क्रीन को डिस्प्ले या डिस्कनेक्ट करता है या नहीं।

मैं सूचनाओं को बहुत किस्मत के बिना इस तरह एक परिदृश्य से निपटने के लिए कोको प्रलेखन खोज की है, और मुझे विश्वास है वहाँ जब से जुड़ा प्रदर्शित करता है की संख्या को बदल पोस्ट हो जाती है कि सिस्टम सूचना किसी प्रकार का नहीं है कि मना प्रणाली।

कैसे इस समस्या को हल करने के लिए पर कोई सुझाव?

+0

शायद 'NSApplicationDidChangeScreenParametersNotification'? –

उत्तर

8

है कि प्राप्त करने के लिए कई तरीके हैं:
आप अपने ऐप के प्रतिनिधि में applicationDidChangeScreenParameters: को लागू कर सकता है (विधि NSApplicationDelegateProtocol का हिस्सा है)।
एक और तरीका NSApplicationDidChangeScreenParametersNotification को डिफ़ॉल्ट अधिसूचना केंद्र [NSNotificationCenter defaultCenter] द्वारा भेजा गया है।

जब भी आपकी प्रतिनिधि विधि को कॉल किया जाता है या आपको अधिसूचना मिलती है, तो आप [NSScreen screens] से अधिक पुन: सक्रिय कर सकते हैं और देख सकते हैं कि कोई डिस्प्ले कनेक्ट हो गया है या हटा दिया गया है (आपको एक प्रदर्शन सूची बनाए रखना है जिसे आप प्रोग्राम लॉन्च पर जांच सकते हैं)।

एक गैर कोको दृष्टिकोण कोर ग्राफिक्स प्रदर्शन सेवाओं के माध्यम से होगा:
आप एक पुनर्विन्यासन समारोह को लागू करने और आप प्रभावित प्रदर्शन के राज्य क्वेरी कर सकता है CGDisplayRegisterReconfigurationCallback(CGDisplayReconfigurationCallBack cb, void* obj);

से पंजीकृत करें अपने पुनर्विन्यासन समारोह में किया है। उदा .:

तेज 3.0 में
void DisplayReconfigurationCallBack(CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void* userInfo) 
{ 
    if(display == someDisplayYouAreInterestedIn) 
    { 
     if(flags & kCGDisplaySetModeFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayRemoveFlag) 
     { 
      ... 
     } 
     if(flags & kCGDisplayDisabledFlag) 
     { 
      ... 
     } 
    } 
    if(flags & kCGDisplaySetModeFlag || flags & kCGDisplayDisabledFlag || flags & kCGDisplayRemoveFlag) 
    { 
     ... 
    } 
} 
+0

आपकी टिप्पणी के लिए धन्यवाद। कोको अधिसूचना और कोको विधियों पर कोर ग्राफिक्स प्रदर्शन सेवाओं का उपयोग करने का क्या फायदा होगा? ऐसा लगता है कि यह किसी भी स्पष्ट लाभ के बिना जटिलता की एक अतिरिक्त परत जोड़ता है। – Gabor

+0

एकमात्र लाभ यह होगा कि पुनर्गठन कॉलबैक में पहले से ही कुछ राज्य जानकारी (CGDisplayChangeSummaryFlags के रूप में वितरित) शामिल है, इसलिए पुनर्गठन होने पर आपको सभी एनएसस्क्रीन विवरणों की तुलना करने की आवश्यकता नहीं है। कोको अधिसूचना या प्रतिनिधि विधि भी बिल्कुल ठीक है। –

3

:

let nc = NotificationCenter.default 
    nc.addObserver(self, 
        selector: #selector(screenDidChange), 
        name: NSNotification.Name.NSApplicationDidChangeScreenParameters, 
        object: nil) 

एनसी कॉल बैक:

final func screenDidChange(notification: NSNotification){ 
    let userInfo = notification.userInfo 
    print(userInfo) 
} 
संबंधित मुद्दे