আমি কীভাবে কোনও এনএসএট্রিবিউটেড স্ট্রিংয়ে ক্লিকযোগ্য লিঙ্ক তৈরি করতে পারি?


200

হাইপারলিংকগুলিকে একটিতে ক্লিকযোগ্য করে তোলা এটি তুচ্ছ UITextView। আপনি কেবল আইবিতে ভিউতে "সনাক্তকারী লিঙ্কগুলি" চেকবাক্স সেট করেছেন এবং এটি এইচটিটিপি লিঙ্কগুলি সনাক্ত করে এবং এগুলিকে হাইপারলিঙ্কে রূপান্তরিত করে।

যাইহোক, এর অর্থ এখনও যে ব্যবহারকারী যা দেখেন তা হ'ল "কাঁচা" লিঙ্ক link আরটিএফ ফাইল এবং এইচটিএমএল উভয়ই আপনাকে "পিছনে" একটি লিঙ্ক সহ একটি ব্যবহারকারী-পঠনযোগ্য স্ট্রিং সেট আপ করতে দেয়।

পাঠ্য দর্শনে বিশিষ্ট পাঠ্যটি ইনস্টল করা সহজ (বা একটি UILabelবা UITextFieldসেই বিষয়ে)

সেখানে একটি ব্যবহারকারী-পাঠযোগ্য টেক্সট যোগ্য করতে একটি উপায় আছে কি UITextView, UILabelবা UITextField?

মার্কআপ এসও-তে আলাদা, তবে সাধারণ ধারণাটি এখানে। আমি যা চাই তা হ'ল পাঠ্য:

এই মোর্ফটি ফেস ডান্সার দিয়ে তৈরি হয়েছিল , অ্যাপ স্টোরটিতে দেখতে ক্লিক করুন।

আমি যে জিনিসটি পেতে পারি তা হ'ল:

এই মোর্ফটি ফেস ডান্সার দিয়ে তৈরি হয়েছিল, অ্যাপ স্টোরটিতে দেখতে http://example.com/facedancer এ ক্লিক করুন ।


এই নমুনা ব্যবহার করে দেখুন .. IFTweetLabel .. আশা করি এটা সাহায্য করে
Vidhyanand


চোখের পলকে 100K অতীত উত্তম কাজ। 100 কে ক্লাবে আপনাকে স্বাগতম। উপযুক্ত!
ওয়াকওমা

@ ভাকাওয়ামা, অপেক্ষা করুন, কখন এটি ঘটেছে? আমি শেষবার looked98 কে ছিলাম! (আমি গুজব শুনেছি যে আপনি 100 কে ক্লাবের সদস্য হিসাবে কিছুটা সোয়াগ পেয়েছেন?)
ডানকান সি

তারা প্রশ্নগুলির উপর ভিত্তি করে +5 থেকে +10 এ পরিবর্তন করেছে, সুতরাং আপনার যদি 800 টি উর্ধ্বতন থাকে তবে আপনি একটি ফ্ল্যাশে +4000 নেট করতে পারবেন। আমি এখনও 100 কে সোয়াগের জন্য অপেক্ষা করছি (এপ্রিলে পার হয়ে গেছে)। সোয়াগ বিক্রেতাদের পরিবর্তন সম্পর্কে কিছু ...
ভ্যাকোয়াম

উত্তর:


156

NSMutableAttributesString ব্যবহার করুন ।

NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
yourTextView.attributedText = str;

সম্পাদনা করুন :

এটি সরাসরি প্রশ্ন সম্পর্কে নয় তবে কেবল স্পষ্ট করার জন্য, UITextFieldএবং UILabelখোলার ইউআরএল সমর্থন করে না। আপনি যদি UILabelলিঙ্কগুলির সাথে ব্যবহার করতে চান তবে আপনি টিটিটিটি্যাট্রিবিউটেড লেবেলটি পরীক্ষা করতে পারেন ।

ক্লিক করার dataDetectorTypesসময় আপনার ইউআরএল খুলতে বা খুলতে আপনার মান সেট করা উচিত । অথবা আপনি মন্তব্যগুলিতে পরামর্শ মতো প্রতিনিধি পদ্ধতি ব্যবহার করতে পারেন।UITextViewUIDataDetectorTypeLinkUIDataDetectorTypeAll


7
হ্যাঁ, এটি কাজ করছে, এটি কেবল একটি ইউআইটিএক্সেক্সটভিউয়ের মধ্যে রাখুন এবং প্রতিনিধি পদ্ধতির ওভাররাইড করুন: - (BOOL) পাঠ্যদর্শন: (ইউআইটিেক্সটভিউ *) পাঠ্যদর্শনটিইউন্ট্র্যাক্টউইথ ইউআরএল: (এনএসআরএল *) ইউআরএল ইনরেঞ্জ: (এনএসরেঞ্জ) চরিত্রের রেঞ্জ
ইউনুস

এটি কোনও ইউআইএলবেলে কাজ করে না - আপনি যখন ক্ষেত্রটি ট্যাপ করেন তখন কিছুই হয় না।
জ্যাক BeNimble

7
@ সাবোহ্নকে আপনি লিঙ্ক ক্লিক করার সময় কোনও পদ্ধতি কল করার অর্থ? যদি তাই ডেলিগেট পদ্ধতিটি বাস্তবায়িত করে থাকেন তবে বৈশিষ্ট্য হিসাবে একটি ডামি ইউআরএল দিন এবং আপনার পদ্ধতিটি কল করুন- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
ujell

2
আমি জানি না কিভাবে এটি কাজ করে। বৈশিষ্ট্যের মান ধরণের হওয়া উচিত NSURL। ----[str addAttribute: NSLinkAttributeName value: [NSURL URLWithString:@"http://www.google.com"] range: NSMakeRange(0, str.length)];
নীরভ ডাঙ্গি

1
@ নীরবডাঙ্গী থেকেNSAttributedString.h UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0); // NSURL (preferred) or NSString
আহমেদ নাওয়ার

142

আমি এটি সত্যিই দরকারী মনে করেছিলাম তবে আমার এটি বেশ কয়েকটি জায়গায় করা দরকার তাই আমি আমার পদ্ধতির একটি সাধারণ এক্সটেনশনে গুটিয়ে রেখেছি NSMutableAttributedString:

সুইফট 3

extension NSMutableAttributedString {

    public func setAsLink(textToFind:String, linkURL:String) -> Bool {

        let foundRange = self.mutableString.range(of: textToFind)
        if foundRange.location != NSNotFound {
            self.addAttribute(.link, value: linkURL, range: foundRange)
            return true
        }
        return false
    }
}

সুইফট 2

import Foundation

extension NSMutableAttributedString {

   public func setAsLink(textToFind:String, linkURL:String) -> Bool {

       let foundRange = self.mutableString.rangeOfString(textToFind)
       if foundRange.location != NSNotFound {
           self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
           return true
       }
       return false
   }
}

ব্যবহারের উদাহরণ:

let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")

if linkWasSet {
    // adjust more attributedString properties
}

উদ্দেশ্য গ

খাঁটি অবজেক্টিভ-সি প্রকল্পে এটি করার জন্য আমি কেবল একটি প্রয়োজনকে আঘাত করেছি, সুতরাং এখানে উদ্দেশ্য-সি বিভাগটি রয়েছে।

@interface NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;

@end


@implementation NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {

     NSRange foundRange = [self.mutableString rangeOfString:textToFind];
     if (foundRange.location != NSNotFound) {
         [self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];
         return YES;
     }
     return NO;
}

@end

ব্যবহারের উদাহরণ:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];

BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];

if (linkWasSet) {
    // adjust more attributedString properties
}

নিশ্চিত হয়ে নিন যে এনএসটিেক্সটফিল্ডের আচরণ বৈশিষ্ট্যটি নির্বাচনযোগ্য হিসাবে সেট করা আছে। এক্সকোড এনএসটিেক্সটফিল্ড আচরণ বৈশিষ্ট্য


এর দ্রুত ব্যবহার / বাস্তবায়ন উদাহরণটি প্রশংসিত হবে।
ioopl

3
@ioop। আমি উপরের মূল পোস্টে খুব ছোট উদাহরণ যুক্ত করেছি, আশা করি এটি সাহায্য করবে।
কার্ল নোসোফ্যাবল

7
এটি সঠিকভাবে কাজ করেছে। শুধু বলতে চাই যে লিঙ্কটি ক্লিকযোগ্য হতে দেওয়ার জন্য আপনার ইউআইটিেক্সটভিউকে বাছাইযোগ্য করে তোলা দরকার
লুজপ

1
@ ফেলেকিয়া জিনেট, উভয় উদ্দেশ্য সি এবং সুইফ্ট বাস্তবায়নের ক্ষেত্রে পদ্ধতিটি একটি বুলিয়ান ফলাফল প্রদান করে যদি কোনও মিল এবং ফলস্বরূপ সেট হয়েছে কিনা তা নির্দেশ করে। আপনি যে ত্রুটিটি দেখছেন তা হ'ল আপনি সেই ফলাফলটি ক্যাপচার করছেন না - যা ভাল। আপনি হয় স্থানীয় ভেরিয়েবলের দায়িত্ব অর্পণ করে ফলাফলটি ক্যাপচার করতে পারেন বা এটি বুলিয়ান মানটি ফিরিয়ে দেওয়া বন্ধ করতে পদ্ধতিটি সামঞ্জস্য করতে পারে যদি এটি আপনার প্রয়োজনের সাথে আরও ভাল মানিয়ে যায়। আমি আশা করি এটি সাহায্য করবে?
কার্ল নোসকেবল

1
@ ফেলিসিএগনেট কোনও সমস্যা নেই, আমি সুইফট এবং অবজেক্টিভসি উদাহরণ দুটিতে পদ্ধতি ফলাফলের সংরক্ষণ এবং চেক যুক্ত করেছি।
কার্ল নোস্যাফুল

34

এই জাতীয় ব্যবহারের ক্ষেত্রে বিশেষভাবে সম্বোধন করার জন্য আমি কেবলমাত্র ইউআইএলবেলের একটি সাবক্লাস তৈরি করেছি। আপনি সহজেই একাধিক লিঙ্ক যুক্ত করতে পারেন এবং তাদের জন্য বিভিন্ন হ্যান্ডলার সংজ্ঞায়িত করতে পারেন। এটি যখন আপনি স্পর্শ প্রতিক্রিয়াটির জন্য স্পর্শ করেন তখন চাপ দেওয়া লিঙ্কটি হাইলাইট করতে সহায়তা করে। দয়া করে https://github.com/null09264/FRHyperLabel দেখুন

আপনার ক্ষেত্রে কোডটি পছন্দ করতে পারে:

FRHyperLabel *label = [FRHyperLabel new];

NSString *string = @"This morph was generated with Face Dancer, Click to view in the app store.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};

label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];

[label setLinkForSubstring:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
    [[UIApplication sharedApplication] openURL:aURL];
}];

নমুনা স্ক্রিনশট (হ্যান্ডলার এই ক্ষেত্রে একটি url খোলার পরিবর্তে একটি সতর্কতা পপ করতে সেট করা হয়েছে)

facedancer


যদি ধরুন আমার পাঠ্যটি এর মতো হয় তবে এই রূপটি ফেস ড্যান্সারের সাথে তৈরি হয়েছিল, অ্যাপ স্টোর ফেস ড্যান্সারে ফেস ডান্সারের ভিউতে ক্লিক করুন। এখানে আমি 3 ফেস ডান্সার করছি এটি এটির জন্য কাজ করছিল না
মঞ্চিকান্তি কৃষ্ণকিশোর

1
এই ক্ষেত্রে দয়া করে - (void)setLinkForRange:(NSRange)range withLinkHandler:(void(^)(FRHyperLabel *label, NSRange selectedRange))handler; পরিবর্তে এপিআই ব্যবহার করুন। গিথুব পৃষ্ঠায় রিডমি উল্লেখ করুন।
জিংহান ওয়াং

1
FRHyperLabel আর কাজ করছে না বলে মনে হচ্ছে। "ক্যারেক্টার ইন্ডেক্সফোরপয়েন্ট:" এর ভিতরে এটি সর্বদা -1 (খুঁজে পাওয়া যায় না) ফিরে আসে।
জন প্যাং

মাল্টলাইন লেবেলের জন্য আমার পক্ষে কাজ করে না। চরিত্রগুলি সনাক্ত করা ভুল। 15-অক্ষরের লিঙ্ক স্ট্রিং কেবল কয়েকটি প্রথম অক্ষরে ক্লিকযোগ্য, অন্যান্য অক্ষর কিছুই করেন না
অ্যাকিড ব্রাইট

27

উজেলের সমাধানে ক্ষুদ্রতর উন্নতি: আপনি যদি এনএসএসআরটিংয়ের পরিবর্তে এনএসআরএল ব্যবহার করেন তবে আপনি যে কোনও ইউআরএল (যেমন কাস্টম ইউআরএল) ব্যবহার করতে পারেন

NSURL *URL = [NSURL URLWithString: @"whatsapp://app"];
NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"start Whatsapp"];
[str addAttribute: NSLinkAttributeName value:URL range: NSMakeRange(0, str.length)];
yourTextField.attributedText = str;

আনন্দ কর!


21

সুইফট 4:

var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSAttributedStringKey.link: URL(string: "http://www.google.com")!])

yourTextView.attributedText = attributedString

সুইফট ৩.১:

var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSLinkAttributeName: URL(string: "http://www.google.com")!])

yourTextView.attributedText = attributedString

এই উত্তরটি ঠিক যেমনটি ঠিক তেমন কাজ করে। অন্যান্য উত্তরগুলি ব্যবহার করে এমন রঙিন বা কাস্টম সাবক্লাসগুলির কোনও প্রয়োজন নেই বলে মনে হয়।
শূন্যপাল

19

আমারও একইরকম প্রয়োজনীয়তা ছিল, প্রথমদিকে আমি ইউআইএলবেল ব্যবহার করেছি এবং তখন আমি বুঝতে পেরেছিলাম যে ইউআইটিেক্সটভিউ আরও ভাল। আমি ইন্টারঅ্যাকশন এবং স্ক্রোলিং অক্ষম করে ইউআইটিএফেক্সটভিউকে ইউআইএলবেলের মতো আচরণ করেছিলাম এবং NSMutableAttributedStringকার্ল যা করেছে তার মতো পাঠ্যের সাথে লিঙ্ক সেট করার জন্য একটি বিভাগ পদ্ধতি তৈরি করেছে (এর জন্য +1) এটি আমার উদ্দেশ্য সি সংস্করণ

-(void)setTextAsLink:(NSString*) textToFind withLinkURL:(NSString*) url
{
    NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];

    if (range.location != NSNotFound) {

        [self addAttribute:NSLinkAttributeName value:url range:range];
        [self addAttribute:NSForegroundColorAttributeName value:[UIColor URLColor] range:range];
    }
}

ক্রিয়াটি পরিচালনা করতে আপনি নীচের প্রতিনিধি ব্যবহার করতে পারেন

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange
{
    // do the task
    return YES;
}

1
যতদূর আমি বলতে পারি NSForegroundColorAttributeNameএমন একটি ব্যাপ্তিতে সেটিংস NSLinkAttributeNameকাজ করে না যেখানে প্রয়োগ করা হয়। কোন ব্যাপার কি, linkTextAttributesএর UITextViewপরিবর্তে ব্যবহার করা হয়। আপনার NSForegroundColorAttributeNameজন্য কাজ করে?
দিমা

আপনি কি নিশ্চিত যে আপনি linkTextAttributesএকই জিনিসটি সেট করছেন না ? বা সম্ভবত tintColor? আপনি কি একই পাঠ্যদর্শনটিতে 2 টি লিঙ্ককে বিভিন্ন বর্ণে দেখাতে সক্ষম?
দিমা

1
এখানে একটি কার্যকারী কোড এনএসআরঞ্জ পরিসীমা = [স্বতঃপ্রযুক্তি রেঞ্জঅফ স্ট্রিং: টেক্সটটোফাইন্ড অপশন: এনএসকেসআইএনসেটিসিটিভ অনুসন্ধান]; if (श्रेणी.location! = NSNotFound) {NSMutableAttributesString * string = [[NSMutableAttributesString বরাদ্দ] initWithString: self.text]; [স্ট্রিং অ্যাডট্রিবিউট: এনএসলিঙ্কআট্রিবিউটনেম মান: ইউআরএল রেঞ্জ: রেঞ্জ]; [স্ট্রিং অ্যাডট্রিবিউট: এনএসফোরগ্রাউন্ড কালারঅ্যাট্রিবিউটনেম মান: [ইউআইকলার ব্লু কালার] রেঞ্জ: রেঞ্জ]; self.text = @ ""; self.attributesText = স্ট্রিং; }
নসভ পাভেল

16

ইউআইটিেক্সটভিউ ব্যবহার করুন এটি ক্লিকযোগ্য লিঙ্কগুলিকে সমর্থন করে। নিম্নলিখিত কোড ব্যবহার করে বিশিষ্ট স্ট্রিং তৈরি করুন

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strSomeTextWithLinks];

তারপরে নীচে ইউআইটিেক্সটভিউ পাঠ্য সেট করুন

NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor redColor],

                                 NSUnderlineColorAttributeName: [UIColor blueColor],

                                 NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};

customTextView.linkTextAttributes = linkAttributes; // customizes the appearance of links
textView.attributedText = attributedString;

নিশ্চিত হয়ে নিন যে আপনি XIB- এ UITextView এর "নির্বাচনযোগ্য" আচরণ সক্ষম করেছেন।


15
আমি মনে করি এটিই সেরা সমাধান! সক্রিয়করণ সম্পর্কে নোট Selectableগুরুত্বপূর্ণ!
লুনাকোডগার্ল

এটি আমার জন্য লিঙ্কটিকে আন্ডারলাইন করে নি (আইওএস 7, 8)। আমার এনএসউন্ডারলাইন স্টাইলঅ্যাট্রিবিউটনেম ব্যবহার করা দরকার: [এনএস নাম্বারসংখ্যার সাথে: এনএসউন্ডারলাইন স্টাইলসিংল]
প্রিভিট

1
এটিকে বাছাইযোগ্য করা সবচেয়ে গুরুত্বপূর্ণ এবং অ স্বজ্ঞাত তথ্য!
নিকোলাস মাসার্ট

13

আমার প্রশ্নের কেন্দ্রবিন্দুটি হ'ল আমি টেক্সট ভিউগুলিতে / ক্ষেত্রগুলিতে / লেবেলে ক্লিকযোগ্য লিঙ্কগুলি তৈরি করতে সক্ষম হতে চেয়েছিলাম যাতে টেক্সটটি পরিচালনা করতে এবং লিঙ্কগুলি যুক্ত করতে কাস্টম কোড না লিখে। আমি এটি ডেটা চালিত হতে চেয়েছিলেন।

আমি কীভাবে এটি করব তা অবশেষে বুঝতে পারলাম। বিষয়টি হ'ল আইবি এম্বেড করা লিঙ্কগুলিকে সম্মান করে না।

তদ্ব্যতীত, আইওএস সংস্করণ NSAttributedStringআপনাকে আরটিএফ ফাইল থেকে একটি বিশিষ্ট স্ট্রিং আরম্ভ করতে দেয় না। এর OS X এর সংস্করণ NSAttributedString আছে একটি সূচনাকারী যে ইনপুট হিসাবে একটি RTF ফাইল লাগে না।

NSAttributedString এনএসকোডিং প্রোটোকল অনুসারে কাজ করে, যাতে আপনি এটিকে এনএসডিটাতে / থেকে রূপান্তর করতে পারেন

আমি একটি ওএস এক্স কমান্ড লাইন সরঞ্জাম তৈরি করেছি যা একটি আরটিএফ ফাইলকে ইনপুট হিসাবে গ্রহণ করে এবং এক্সটেনশন .ডাটাতে এনএসকোডিং থেকে এনএসডিটা ধারণ করে এমন একটি ফাইল আউটপুট করে। আমি তখন আমার প্রকল্পে .ডাটা ফাইলটি রেখেছি এবং কোডের কয়েকটি লাইন যুক্ত করেছি যা পাঠ্যটিকে ভিউতে লোড করে। কোডটি এর মতো দেখাচ্ছে (এই প্রকল্পটি সুইফটে ছিল):

/*
If we can load a file called "Dates.data" from the bundle and convert it to an attributed string,
install it in the dates field. The contents contain clickable links with custom URLS to select
each date.
*/
if
  let datesPath = NSBundle.mainBundle().pathForResource("Dates", ofType: "data"),
  let datesString = NSKeyedUnarchiver.unarchiveObjectWithFile(datesPath) as? NSAttributedString
{
  datesField.attributedText = datesString
}

অ্যাপ্লিকেশনগুলিতে প্রচুর ফর্ম্যাটযুক্ত পাঠ্য ব্যবহৃত হয়, আমি একটি বিল্ড রুল তৈরি করি যা Xcode কে বলে যে প্রদত্ত ফোল্ডারে থাকা সমস্ত .rtf ফাইলগুলি উত্স এবং .ডাটা ফাইলগুলি আউটপুট। একবার আমি এটি করার পরে, আমি কেবল নির্ধারিত ডিরেক্টরিতে .rtf ফাইলগুলি যুক্ত করব, (বা বিদ্যমান ফাইলগুলি সম্পাদনা করুন) এবং বিল্ড প্রক্রিয়া চিত্রটি নির্ধারণ করে যে তারা নতুন / আপডেট হয়েছে, কমান্ড লাইন সরঞ্জাম চালায় এবং অ্যাপ্লিকেশন বান্ডেলে ফাইলগুলি অনুলিপি করে। এটি সুন্দরভাবে কাজ করে।

আমি একটি ব্লগ পোস্ট লিখেছিলাম যা কৌশলটি প্রদর্শন করে একটি নমুনা (সুইফ্ট) প্রকল্পের সাথে লিঙ্ক করে। আপনি এখানে দেখতে পারেন:

আপনার অ্যাপে খোলার একটি ইউআইটিেক্সটফিল্ডে ক্লিকযোগ্য URL গুলি তৈরি করা


11

বিশিষ্ট পাঠ্যের ট্যাপগুলিতে ক্রিয়াগুলি সনাক্ত করতে সুইফট 3 উদাহরণ

https://stackoverflow.com/a/44226491/5516830

let termsAndConditionsURL = TERMS_CONDITIONS_URL;
let privacyURL            = PRIVACY_URL;

override func viewDidLoad() {
    super.viewDidLoad()

    self.txtView.delegate = self
    let str = "By continuing, you accept the Terms of use and Privacy policy"
    let attributedString = NSMutableAttributedString(string: str)
    var foundRange = attributedString.mutableString.range(of: "Terms of use") //mention the parts of the attributed text you want to tap and get an custom action
    attributedString.addAttribute(NSLinkAttributeName, value: termsAndConditionsURL, range: foundRange)
    foundRange = attributedString.mutableString.range(of: "Privacy policy")
    attributedString.addAttribute(NSLinkAttributeName, value: privacyURL, range: foundRange)
    txtView.attributedText = attributedString
}

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "WebView") as! SKWebViewController

    if (URL.absoluteString == termsAndConditionsURL) {
        vc.strWebURL = TERMS_CONDITIONS_URL
        self.navigationController?.pushViewController(vc, animated: true)
    } else if (URL.absoluteString == privacyURL) {
        vc.strWebURL = PRIVACY_URL
        self.navigationController?.pushViewController(vc, animated: true)
    }
    return false
}

বুদ্ধিমানের মতো আপনি shouldInteractWith URLইউআইটিেক্সটফিল্ডডেলিগেট পদ্ধতিতে আপনার যে কোনও ক্রিয়াকলাপ যোগ করতে পারেন ।

চিয়ার্স !!


7

দ্রুত উত্তরটি ইউআইএলবেলের পরিবর্তে ইউআইটিেক্সটভিউ ব্যবহার করছে। আপনাকে সক্ষম Selectableএবং অক্ষম করা দরকার Editable

তারপরে স্ক্রোল সূচক এবং বাউন্স অক্ষম করুন।

স্ক্রিন শট

স্ক্রিন শট

আমার সমাধানটি NSMutableAttributedStringএইচটিএমএল স্ট্রিং ব্যবহার করেNSHTMLTextDocumentType

NSString *s = @"<p><a href='https://itunes.apple.com/us/app/xxxx/xxxx?mt=8'>https://itunes.apple.com/us/app/xxxx/xxxx?mt=8</a></p>";

NSMutableAttributedString *text = [[NSMutableAttributedString alloc]
                                           initWithData: [s dataUsingEncoding:NSUnicodeStringEncoding]
                                           options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
                                           documentAttributes: nil
                                           error: nil
                                           ];

cell.content.attributedText = text;

এই. আমি আমার রিসোর্স বান্ডেল থেকে একটি আরটিএফ ফাইলটি পড়তে সক্ষম হয়েছি, এটিকে রূপান্তর করতে NSAttributedString, এটি attributedTextআমার UITextViewএবং হাইপারলিংকের কাজ হিসাবে সেট করে ফেলেছি ! প্রতিটি হাইপারলিঙ্কের ব্যাপ্তি খুঁজে বের করে এট্রিবিউট ব্যবহার করে সেট আপ করা অনেক কাজ হত।
নিকোলাস মিয়ারি

6

আমি একটি পদ্ধতি লিখেছি, যা একটি নির্দিষ্ট url (urlString) এর সাথে একটি স্ট্রিং (ফুলস্ট্রিং) এ একটি লিঙ্ক (লিংকস্ট্রিং) যুক্ত করে:

- (NSAttributedString *)linkedStringFromFullString:(NSString *)fullString withLinkString:(NSString *)linkString andUrlString:(NSString *)urlString
{
    NSRange range = [fullString rangeOfString:linkString options:NSLiteralSearch];
    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:fullString];

    NSMutableParagraphStyle *paragraphStyle = NSMutableParagraphStyle.new;
    paragraphStyle.alignment = NSTextAlignmentCenter;
    NSDictionary *attributes = @{NSForegroundColorAttributeName:RGB(0x999999),
                                 NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue-Light" size:10],
                                 NSParagraphStyleAttributeName:paragraphStyle};
    [str addAttributes:attributes range:NSMakeRange(0, [str length])];
    [str addAttribute: NSLinkAttributeName value:urlString range:range];

    return str;
}

আপনার এটিকে এটি বলা উচিত:

NSString *fullString = @"A man who bought the Google.com domain name for $12 and owned it for about a minute has been rewarded by Google for uncovering the flaw.";
NSString *linkString = @"Google.com";
NSString *urlString = @"http://www.google.com";

_youTextView.attributedText = [self linkedStringFromFullString:fullString withLinkString:linkString andUrlString:urlString];

এটি ক্লিকযোগ্য তবে এটি লিঙ্ক বা কিছুই খুলবে না। এটি ঠিক এমন বোতামের মতো ক্লিক করে যা কিছুই করে না।
রেজা.আবি

5

আমার একটি খাঁটি ইউআইএলবেল ব্যবহার করা চালিয়ে যাওয়া দরকার, তাই এটি আমার ট্যাপ শনাক্তকারী থেকে বলা হয়েছিল (এটি ম্যালেক্সের প্রতিক্রিয়ার ভিত্তিতে এখানে: ইউআইএলবেলের স্পর্শ পয়েন্টে অক্ষর সূচক )

UILabel* label = (UILabel*)gesture.view;
CGPoint tapLocation = [gesture locationInView:label];

// create attributed string with paragraph style from label

NSMutableAttributedString* attr = [label.attributedText mutableCopy];
NSMutableParagraphStyle* paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.alignment = label.textAlignment;

[attr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.attributedText.length)];

// init text storage

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attr];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];

// init text container

NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(label.frame.size.width, label.frame.size.height+100) ];
textContainer.lineFragmentPadding  = 0;
textContainer.maximumNumberOfLines = label.numberOfLines;
textContainer.lineBreakMode        = label.lineBreakMode;

[layoutManager addTextContainer:textContainer];

// find tapped character

NSUInteger characterIndex = [layoutManager characterIndexForPoint:tapLocation
                                                  inTextContainer:textContainer
                         fractionOfDistanceBetweenInsertionPoints:NULL];

// process link at tapped character

[attr enumerateAttributesInRange:NSMakeRange(characterIndex, 1)
                                         options:0
                                      usingBlock:^(NSDictionary<NSString *,id> * _Nonnull attrs, NSRange range, BOOL * _Nonnull stop) {
                                          if (attrs[NSLinkAttributeName]) {
                                              NSString* urlString = attrs[NSLinkAttributeName];
                                              NSURL* url = [NSURL URLWithString:urlString];
                                              [[UIApplication sharedApplication] openURL:url];
                                          }
                                      }];

এটি বেশ সহায়ক ছিল, আমি শেষ লাইনে অক্ষরগুলি থেকে সূচকগুলি পেতে পারিনি। সিজি সাইজ শুরু করার সময় আপনার কোডটিতে টেক্সটকন্টেইনারটিতে +100 রয়েছে যা আমার কাছে পুরোপুরি বোঝায় না, তবে এটি কৌশলটি করেছে।
ব্লুথের

4

হালনাগাদ:

আমার প্রশ্নের 2 টি মূল অংশ ছিল:

  1. ক্লিকযোগ্যযোগ্য লিঙ্কটির জন্য প্রদর্শিত পাঠ্যটি যে অনুরোধ করা হয়েছে তার প্রকৃত লিঙ্কের চেয়ে আলাদা যেখানে কীভাবে একটি লিঙ্ক তৈরি করবেন:
  2. পাঠ্যে বৈশিষ্ট্যগুলি সেট করতে কাস্টম কোড ব্যবহার না করে কীভাবে লিঙ্কগুলি সেট আপ করবেন।

দেখা যাচ্ছে যে আইওএস 7 এর থেকে বিশিষ্ট পাঠ্য লোড করার ক্ষমতা যুক্ত করেছে NSData

আমি এর একটি কাস্টম সাবক্লাস তৈরি করেছি UITextViewযা @IBInspectableবৈশিষ্ট্যের সুবিধা নিয়ে যায় এবং আপনাকে আইবিতে কোনও আরটিএফ ফাইল থেকে সামগ্রী লোড করতে দেয়। আপনি কেবল ফাইল নাম আইবিতে টাইপ করুন এবং কাস্টম ক্লাসটি বাকীটি করে।

বিশদটি এখানে:

আইওএস 7 এ, NSAttributedStringপদ্ধতিটি অর্জন করেছে initWithData:options:documentAttributes:error:। এই পদ্ধতিটি আপনাকে একটি এনএসডিটা অবজেক্ট থেকে একটি এনএসএট্রিবিউটেড স্ট্রিং লোড করতে দেয়। আপনি প্রথমে একটি আরটিএফ ফাইলটি এনএসডিটাতে initWithData:options:documentAttributes:error:লোড করতে পারেন, তারপরে সেই এনএসডিটা আপনার পাঠ্য দৃশ্যে লোড করতে ব্যবহার করুন । (মনে রাখবেন যে এমন একটি পদ্ধতি রয়েছে initWithFileURL:options:documentAttributes:error:যা সরাসরি কোনও ফাইল থেকে কোনও গুণিত স্ট্রিং লোড করতে পারে, তবে সেই পদ্ধতিটি আইওএস dep-এ অবহেলা করা হয়েছিল the পদ্ধতিটি ব্যবহার করা আরও নিরাপদ initWithData:options:documentAttributes:error:, যা অবহেলা করা হয়নি)।

আমি এমন একটি পদ্ধতি চেয়েছিলাম যা আমার ব্যবহারযোগ্য লিঙ্কগুলির সাথে নির্দিষ্ট কোনও কোড তৈরি না করেই আমার পাঠ্য দর্শনে ক্লিকযোগ্য লিঙ্কগুলি ইনস্টল করতে দেয়।

সমাধান আমি নিয়ে এসেছেন UITextView আমি কলের একটি কাস্টম উপশ্রেণী তৈরি করতে ছিল RTF_UITextViewএবং এটি একটি দিতে @IBInspectableসম্পত্তি নামক RTF_Filename। কোনও @IBInspectableবৈশিষ্ট্যে বৈশিষ্ট্য যুক্ত করার কারণে ইন্টারফেস বিল্ডার "বৈশিষ্ট্য পরিদর্শক" এ সেই সম্পত্তিটি প্রকাশ করে। তারপরে আপনি কাস্টম কোডটি আইবি থেকে মানটি সেট করতে পারেন।

আমি @IBDesignableআমার কাস্টম ক্লাসে একটি বৈশিষ্ট্যও যুক্ত করেছি। @IBDesignableঅ্যাট্রিবিউট Xcode বলে যে এটা ইন্টারফেস রচয়িতা মধ্যে আপনার কাস্টম দৃশ্য ক্লাসের একটি চলমান কপি ইনস্টল করা উচিত তাই আপনি এটি আপনার ভিউ অনুক্রমের গ্রাফিকাল প্রদর্শনে দেখতে পারেন। () দুর্ভাগ্যক্রমে, এই শ্রেণীর জন্য, @IBDesignableসম্পত্তিটি ফ্ল্যাশ বলে মনে হচ্ছে। এটি প্রথম যুক্ত করার পরে এটি কার্যকর হয়েছিল, তবে তারপরে আমি আমার পাঠ্য দৃশ্যের সরল পাঠ্য সামগ্রীগুলি মুছলাম এবং আমার দৃশ্যে ক্লিকযোগ্য লিঙ্কগুলি চলে গেল এবং আমি সেগুলি ফিরে পেতে সক্ষম হইনি))

আমার জন্য কোড RTF_UITextViewখুব সহজ। যোগ করা ছাড়াও @IBDesignableঅ্যাট্রিবিউটে একটি RTF_Filenameসঙ্গে সম্পত্তি @IBInspectableঅ্যাট্রিবিউট, আমি একটি যোগ didSet()করার পদ্ধতি RTF_Filenameসম্পত্তি। didSet()পদ্ধতি মান যে কোনো সময় বলা পরার RTF_Filenameসম্পত্তি পরিবর্তন। didSet()পদ্ধতির কোডটি বেশ সহজ:

@IBDesignable
class RTF_UITextView: UITextView
{
  @IBInspectable
  var RTF_Filename: String?
    {
    didSet(newValue)
    {
      //If the RTF_Filename is nil or the empty string, don't do anything
      if ((RTF_Filename ?? "").isEmpty)
      {
        return
      }
      //Use optional binding to try to get an URL to the
      //specified filename in the app bundle. If that succeeds, try to load
      //NSData from the file.
      if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"),
        
        //If the fileURL loads, also try to load NSData from the URL.
        let theData = NSData(contentsOfURL: fileURL)
      {
        var aString:NSAttributedString
        do
        {
          //Try to load an NSAttributedString from the data
          try
            aString = NSAttributedString(data: theData,
              options: [:],
              documentAttributes:  nil
          )
          //If it succeeds, install the attributed string into the field.
          self.attributedText = aString;
        }
        catch
        {
          print("Nerp.");
        }
      }
      
    }
  }
}

মনে রাখবেন যে যদি @ আইবিডিজাইনেবল সম্পত্তি আপনার স্টাইলযুক্ত পাঠ্যটি ইন্টারফেস বিল্ডারে নির্ভরযোগ্যভাবে মঞ্জুরি দেয় না তবে উপরের কোডটি কাস্টম সাবক্লাসের পরিবর্তে ইউআইটিেক্সটভিউয়ের এক্সটেনশন হিসাবে সেট করা ভাল। আপনি কাস্টম ক্লাসে পাঠ্য দর্শন পরিবর্তন না করে যে কোনও পাঠ্য দৃশ্যে এটিকে ব্যবহার করতে পারেন।

আইওএস 7 এর পূর্বে আপনার যদি আইওএস সংস্করণগুলি সমর্থন করার দরকার হয় তবে আমার অন্য উত্তরটি দেখুন।

আপনি একটি নমুনা প্রকল্প ডাউনলোড করতে পারেন যা এই নতুন ক্লাসটি গিটহাব থেকে অন্তর্ভুক্ত করেছে:

DatesInSwift ডেমো প্রকল্পের GitHub থেকে


3

ইউআইটিেক্সটভিউয়ের জন্য কেবল একটি কোড-মুক্ত সমাধান সন্ধান করুন: এখানে চিত্র বর্ণনা লিখুন

সনাক্তকরণ-> লিংক বিকল্পগুলি, ইউআরএল এবং ইমেলটি সক্ষম এবং সনাক্তযোগ্য সক্ষম হবে!


3
এটি লিঙ্কগুলিকে ক্লিকযোগ্য করে তোলে। আমি ব্যবহারকারীর দ্বারা পঠনযোগ্য পাঠ্য থাকতে চাই যার পিছনে একটি লিঙ্ক রয়েছে। আমার মূল প্রশ্নে উদাহরণটি দেখুন।
ডানকান সি

হ্যাঁ, আমার উত্তরটি লিঙ্কটি পাঠ্যের মতো একই ক্ষেত্রে প্রযোজ্য। লিঙ্কটি যদি অন্য জিনিস হয় তবে আমি @ উজেল এর উত্তর অনুসরণ করব।
বিল চ্যান

3
আমার প্রশ্নটি খুব স্পষ্টভাবে ক্লিকযোগ্য টেক্সট সম্পর্কে ছিল যা URL ব্যতীত অন্য কিছু প্রদর্শন করে। প্রশ্নটিতে আপনি এক নজরে দেখার চেয়ে বেশি কিছু করেননি, তাই না?
ডানকান সি

1
অন্যের উদ্দেশ্যে কাজ করে নি তবে অবশ্যই এটি আমার সন্ধানের জন্য সন্ধান করতে এসেছিল ... আমার চ্যাট অ্যাপ্লিকেশনটিতে লিঙ্কগুলি ক্লিক করার যোগ্য উপায়। বিঙ্গো আমি এই নিবন্ধটি পেয়েছি ... ধন্যবাদ! উইশ এক্সকোড টুইটার এবং হ্যাশ ট্যাগ সক্ষম করার অনুমতি দেয়।
মিজআকিটা

এটি কাঁচা লিঙ্কযুক্ত কাস্টম পাঠ্যের সাথেও কাজ করে। আচরণ -> নির্বাচনযোগ্য এবং সনাক্তকরণ -> লিঙ্কগুলি নির্বাচন করতে ভুলবেন না।
krlbsk

3

সুইফ্ট সংস্করণ:

    // Attributed String for Label
    let plainText = "Apkia"
    let styledText = NSMutableAttributedString(string: plainText)
    // Set Attribuets for Color, HyperLink and Font Size
    let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(14.0), NSLinkAttributeName:NSURL(string: "http://apkia.com/")!, NSForegroundColorAttributeName: UIColor.blueColor()]
    styledText.setAttributes(attributes, range: NSMakeRange(0, plainText.characters.count))
    registerLabel.attributedText = styledText

3

ইউআইটিএক্সেক্সটভিউ ব্যবহার করুন এবং লিঙ্কের জন্য ডেটা ডিটেক্টর টাইপগুলি সেট করুন।

এটার মত:

testTextView.editable = false 
testTextView.dataDetectorTypes = .link

আপনি যদি লিঙ্ক, ফোন নম্বর, ঠিকানা ইত্যাদি সনাক্ত করতে চান তবে এটি

testTextView.dataDetectorTypes = .all

3
না এটি কেবল আপনাকে লিঙ্কগুলিকে ক্লিকযোগ্য করে তুলতে দেয়। আমার প্রশ্নটি "এখানে ক্লিক করুন" ক্লিকযোগ্যযোগ্য, এমন কোনও ইউআরএল নয়, এর মতো স্বেচ্ছাসেবী পাঠ্য করার জন্য নির্দিষ্টhttp://somedomain/someurl?param=value
ডানকান সি

2

ডানকান সি-র মূল বিবরণ আইবি-এর আচরণের মধ্যে একটি দ্রুত সংযোজন। তিনি লিখেছেন: "হাইপারলিংকগুলি ইউআইটিেক্সটভিউতে ক্লিকযোগ্য করে তোলার পক্ষে এটি তুচ্ছ।

আমার অভিজ্ঞতা (কমপক্ষে এক্সকোড in এ) হ'ল ইউআরএলগুলি সনাক্ত ও ক্লিকযোগ্য হওয়ার জন্য আপনাকে "সম্পাদনযোগ্য" আচরণটিও অনাবৃত করতে হবে।


2

@ কার্ল নোসোবাইল এবং @ ইজলভার উপরে যে সরবরাহ করেছেন তা নিয়ে আপনার যদি সমস্যা হয় তবে আমি এনএসমেটেবলঅ্যাট্রিবিউটড স্ট্রিং এক্সটেনশনটিকে তার সুইফট 4 সংস্করণে আপডেট করেছি।

extension NSMutableAttributedString {

public func setAsLink(textToFind:String, linkURL:String) -> Bool {

    let foundRange = self.mutableString.range(of: textToFind)
    if foundRange.location != NSNotFound {
         _ = NSMutableAttributedString(string: textToFind)
        // Set Attribuets for Color, HyperLink and Font Size
        let attributes = [NSFontAttributeName: UIFont.bodyFont(.regular, shouldResize: true), NSLinkAttributeName:NSURL(string: linkURL)!, NSForegroundColorAttributeName: UIColor.blue]

        self.setAttributes(attributes, range: foundRange)
        return true
    }
    return false
  }
}


0

আপনি যদি কোনও ইউআইটিেক্সটভিউতে NSLinkAttributeName ব্যবহার করতে চান তবে আপনি অ্যাট্রিবিউটটেক্সটভিউ লাইব্রেরিটি বিবেচনা করতে পারেন। এটি একটি ইউআইটিেক্সটভিউ সাবক্লাস যা এগুলি পরিচালনা করতে খুব সহজ করে তোলে। আরও তথ্যের জন্য দেখুন: https://github.com/evermeer/AtribribTTxtView

আপনি পাঠ্যের যে কোনও অংশকে এভাবে ইন্টারঅ্যাক্ট করতে পারেন (যেখানে টেক্সটভিউ 1 একটি ইউআইটিেক্সটভিউ আইব্লটলেট):

textView1.attributer =
    "1. ".red
    .append("This is the first test. ").green
    .append("Click on ").black
    .append("evict.nl").makeInteract { _ in
        UIApplication.shared.open(URL(string: "http://evict.nl")!, options: [:], completionHandler: { completed in })
    }.underline
    .append(" for testing links. ").black
    .append("Next test").underline.makeInteract { _ in
        print("NEXT")
    }
    .all.font(UIFont(name: "SourceSansPro-Regular", size: 16))
    .setLinkColor(UIColor.purple) 

এবং হ্যাশট্যাগগুলি পরিচালনা ও উল্লেখ করার জন্য আপনি এই জাতীয় কোড ব্যবহার করতে পারেন:

textView1.attributer = "@test: What #hashtags do we have in @evermeer #AtributedTextView library"
    .matchHashtags.underline
    .matchMentions
    .makeInteract { link in
        UIApplication.shared.open(URL(string: "https://twitter.com\(link.replacingOccurrences(of: "@", with: ""))")!, options: [:], completionHandler: { completed in })
    }

0

আপনি যদি আপনার ইউআইটিেক্সটভিউতে সক্রিয় সাবস্ট্রিং চান তবে আপনি আমার বর্ধিত টেক্সটভিউটি ব্যবহার করতে পারেন ... এটির সংক্ষিপ্ত এবং সহজ। আপনি এটি চান হিসাবে এটি সম্পাদনা করতে পারেন।

ফলাফল: এখানে চিত্র বর্ণনা লিখুন

কোড: https://github.com/marekmand/ActiveSubstringTextView


0
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strSomeTextWithLinks];

NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor redColor],   
                                 NSUnderlineColorAttributeName: [UIColor blueColor],
                                 NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};

customTextView.linkTextAttributes = linkAttributes; // customizes the appearance of links
textView.attributedText = attributedString;

গুরুত্বপূর্ণ দিক:

  • নিশ্চিত হয়ে নিন যে আপনি XIB- এ UITextView এর "নির্বাচনযোগ্য" আচরণ সক্ষম করেছেন।
  • নিশ্চিত হয়ে নিন যে আপনি XIB- এ ইউআইটিেক্সটভিউয়ের "সম্পাদনযোগ্য" আচরণটি অক্ষম করেছেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.