2009-06-11 12 views
5

मैं एक्सकोड में मैक एप्लिकेशन विकसित कर रहा हूं। मुझे एक हाइपरलिंक जोड़ने की ज़रूरत है जो किसी विशेष साइट पर नेविगेट करता है। मैंने बटन का उपयोग करके इसे करने की कोशिश की, लेकिन मुझे पता होना चाहिए कि जब कर्सर उस बटन पर है तो कर्सर को हाथ कर्सर में कैसे बदला जाए।हाइपरलिंक

उत्तर

8

मेरा मानना ​​है कि आप यूआरएल प्रदर्शित करने के लिए एक गैर-संपादन योग्य एनएसटीक्स्टफाल्ड का उपयोग कर सकते हैं। यदि आप NSAttributedString पर उचित रूप से गुण सेट करते हैं जिसे आपने फ़ील्ड की मान संपत्ति के रूप में सेट किया है, तो यह मानक नीली-अंडरलाइन के रूप में प्रदर्शित होगा और आपके लिए कर्सर ट्रैकिंग को संभालेगा। This ऐप्पल क्यू & ए आपको बताता है कि यूआरएल के लिए गुण कैसे सेट करें।

+0

इस ऐप्पल टेक नोट के साथ एकमात्र मुद्दा यह है कि माउस कर्सर अभी भी माउस पर आई-बीम टेक्स्ट एंट्री स्टाइल कर्सर में बदल जाता है। –

+0

एक और मुद्दा यह है कि लिंक पर क्लिक करने से सिस्टम डिफ़ॉल्ट में NSTextField का फ़ॉन्ट बदल जाता है। निम्नलिखित फ़ील्ड जो टेक्स्ट फ़ील्ड के फ़ॉन्ट को प्राप्त करने के लिए पाठ को मजबूर कर मेरे लिए गड़बड़ कर रहे हैं: '[attString addAttribute: NSFontAttributeName मान: [लेबल फ़ॉन्ट] रेंज: एनएसएमकेरेंज (0, [एटस्ट्रिंग लम्बाई])]; ' –

4

कर्सर सेट करने के लिए, आपको कर्सर ट्रैकिंग विधि addCursorRect:cursor: का उपयोग करना होगा। हालांकि, आप वास्तव में केवल resetCursorRects विधि के अंदर से उस विधि को कॉल करना चाहते हैं। यदि आप इसे किसी अन्य समय करते हैं, तो मूल रूप से इसे अनदेखा करने की गारंटी दी जाती है।

तो यह आप NSButton उपवर्ग की जरूरत का मतलब है (या जो भी NSView उपवर्ग आप उपयोग करना चाहते हैं) और resetCursorRects ओवरराइड पूरे दृश्य की bounds के लिए addCursorRect:cursor: कॉल करने के लिए।

+0

पूरी तरह से मेरे लिए काम किया है, धन्यवाद। मैंने एनएसटीक्स्टफाल्ड उप-वर्गीकृत किया है। –

2

मैं इस अद्यतन पर जो भी ठोकर खाता है उसके लिए एक अद्यतन उत्तर में फेंकना चाहता हूं।

मुझे पता चला कि जब मैंने बैरी के उत्तर में ऐप्पल क्यू & ए द्वारा निर्दिष्ट समाधान का प्रयास किया था, तो क्लिक किए जाने पर मेरे लेबल लिंक का टेक्स्ट कम हो जाएगा। कुछ डीबगिंग के बाद, मुझे पता चला कि ऐप्पल के आलेख पर नमूना कोड एक नई विशेषता वाली स्ट्रिंग सेट कर रहा था, लेकिन लेबल नियंत्रण पर किसी भी मूल विशेषता को शुरू करने के लिए नहीं था। समाधान केवल लेबल की मूल विशेषता वाली स्ट्रिंग की प्रतिलिपि से शुरू करना है, नई हाइपरलिंक गुण जोड़ें, और उसके बाद लेबल को अपडेट करें।

मैंने एक साधारण सहायक फ़ंक्शन बनाया है जो एक NSTextField लेबल को हाइपरलिंक में बदल देता है। यह मूल रूप से NSAttributeString में श्रेणी एक्सटेंशन जोड़ने की आवश्यकता के बिना ऐप्पल के पृष्ठ पर समाधान को समेकित करता है।

// Converts an otherwise plain NSTextField label into a hyperlink 
-(void)updateControl:(NSTextField*)control withHyperlink:(NSString*)strURL 
{ 
    // both are needed, otherwise hyperlink won't accept mousedown 
    [control setAllowsEditingTextAttributes: YES]; 
    [control setSelectable: YES]; 

    NSURL* url = [NSURL URLWithString:strURL]; 

    NSAttributedString* attrString = [control attributedStringValue]; 

    NSMutableAttributedString* attr = [[NSMutableAttributedString alloc] initWithAttributedString:attrString]; 
    NSRange range = NSMakeRange(0, [attr length]); 

    [attr addAttribute:NSLinkAttributeName value:url range:range]; 
    [attr addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range ]; 
    [attr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range]; 

    [control setAttributedStringValue:attr]; 
} 

और फिर यह आह्वान करने के लिए, कुछ समय जब खिड़की initializes NSTextField और यूआरएल स्ट्रिंग में पारित:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    [self updateControl:_label withHyperlink:@"http://www.stackoverflow.com"]; 

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