ইউআইটিেক্সটভিউয়ের লিঙ্কে ক্লিক কীভাবে বাধা দেওয়া যায়?


104

যখন ইউআইটিেক্সটভিউতে ব্যবহারকারী স্বতঃরীক্ষণ ফোনের লিঙ্কটি স্পর্শ করে তখন কি কাস্টম ক্রিয়া সম্পাদন করা সম্ভব? পরিবর্তে ইউআইউইউবভিউ ব্যবহার করার পরামর্শ দিবেন না।

এবং দয়া করে কেবল অ্যাপল ক্লাসের রেফারেন্স থেকে পাঠ্য পুনরাবৃত্তি করবেন না - অবশ্যই আমি ইতিমধ্যে এটি পড়েছি।

ধন্যবাদ

উত্তর:


147

আপডেট: থেকে ,

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;

থেকে এবং পরে UITextViewডেলিগেট পদ্ধতি রয়েছে:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*

লিঙ্কগুলিতে ক্লিকগুলি বিরত রাখতে। এবং এটি এটি করার সেরা উপায়।

জন্য এবং এর আগে করার একটি দুর্দান্ত উপায় হ'ল সাবক্লাসিং UIApplicationএবং ওভাররাইট করে-(BOOL)openURL:(NSURL *)url

@interface MyApplication : UIApplication {

}

@end

@implementation MyApplication


-(BOOL)openURL:(NSURL *)url{
    if  ([self.delegate openURL:url])
         return YES;
    else
         return [super openURL:url];
}
@end

openURL:আপনার প্রতিনিধিতে আপনাকে প্রয়োগ করতে হবে ।

এখনই আপনার নতুন সাবক্লাসের সাথে অ্যাপ্লিকেশনটি শুরু করতে UIApplicationআপনার প্রকল্পের ফাইলটি মূল.এম সনাক্ত করুন। আপনার অ্যাপ্লিকেশনটিকে বুটস্ট্র্যাপ করে এমন এই ছোট ফাইলটিতে সাধারণত এই লাইন থাকে:

int retVal = UIApplicationMain(argc, argv, nil, nil);

তৃতীয় প্যারামিটারটি আপনার আবেদনের শ্রেণীর নাম। সুতরাং, এই লাইনটি প্রতিস্থাপন করে:

int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

এটি আমার জন্য কৌশলটি করেছে।


শেষ রিয়েল উত্তর! সহজ এবং দুর্দান্ত ধারণা। ধন্যবাদ, এটি কাজ করে। এটি অনেক দিন আগে ছিল, তাই আমি এটি ইতিমধ্যে এটি ছাড়া পরিচালনা করেছি। তবুও ভবিষ্যতে সাহায্য করতে পারে। যদিও ছোট সংশোধন করা হচ্ছে, সুপার ইন-ইন শাখার ফলাফল ফিরিয়ে দেওয়া উচিত: ফিরে আসুন [সুপার ওপেন URL: url];
ভ্লাদিমির

4
আপনি UIApplicationওপেন URL বাস্তবায়নকে শ্রেণিবদ্ধকরণ এবং প্রতিস্থাপন করতে পারেন । যদিও এইভাবে বাস্তব বাস্তবায়নটি উল্লেখ করা কৌতুকপূর্ণ (তবে অসম্ভব নয়)।
এমএক্সসিএল

4
এফওয়াইআই - আমি গিটহাবের উপর একটি ব্রাউজারভিউ কনট্রোলার পোস্ট করেছি যা এটি সম্পূর্ণরূপে বাস্তবায়িত করে, পাশাপাশি ইউআইউইভভিউয়ের মধ্যে থেকে ক্লিক করা সমর্থনকারী লিঙ্কগুলি এখানে সমর্থন করে: github.com/nbuggia/Browser-View-Controller--iPhone-
নাথান বাগুগিয়া

4
এটি কেবল ওয়েব লিঙ্কগুলির জন্যই কাজ করে বলে মনে হচ্ছে, স্বয়ংক্রিয়ভাবে ফোন নম্বরগুলি নয়।
আজদেব

কোন পদ্ধতিতে আমি আমার আবেদনের প্রতিনিধি সেট করতে পারি?
রত্সিমিহ

51

আইওএস 7 বা তারপরে

আপনি নিম্নলিখিত ইউআইটিেক্সটভিউ প্রতিনিধি পদ্ধতি ব্যবহার করতে পারেন:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

ব্যবহারকারী ইউআরএল লিঙ্কটি ট্যাপ করে বা দীর্ঘ-টিপে রাখলে পাঠ্য দর্শনটি এই পদ্ধতিটিকে কল করে। এই পদ্ধতির বাস্তবায়ন isচ্ছিক। ডিফল্টরূপে, পাঠ্য দর্শনটি ইউআরএল টাইপ পরিচালনার জন্য দায়ী অ্যাপ্লিকেশনটি খোলায় এবং এটি URL টি পাস করে। আপনি এই পদ্ধতিটি বিকল্প ক্রিয়াকে ট্রিগার করতে ব্যবহার করতে পারেন, যেমন বর্তমান অ্যাপ্লিকেশনটির মধ্যে একটি ওয়েব ভিউতে URL এ ওয়েব সামগ্রী প্রদর্শন করা।

গুরুত্বপূর্ণ:

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


আমি খুশি যে তারা এটি ইউআইটিএক্সেক্সটভিউ ডেলেগেটে যুক্ত করেছে।
fsaint

দুর্ভাগ্যবশত আপনি এখনও ব্যবহার শেষ করব UIWebViewযদি আপনি কিছু অন্যান্য পাঠ্য করতে চাই লিংক এবং URL- এ নিজেই। সেই ক্ষেত্রে ট্যাগটি এখনও যাওয়ার সেরা উপায়। <a>
এমএলকিউ

যদি অন্য লোকেরা এটি দেখে তবে আপনি এখন অন্য কিছু পাঠ্যকে লিঙ্কটি তৈরি করতে পারেন।
স্কিমেট্রিকাল

10

সুইফট 3 এর জন্য

textView.delegate = self

extension MyTextView: UITextViewDelegate {

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

        GCITracking.sharedInstance.track(externalLink: URL)
        return true
    }
}

অথবা যদি লক্ষ্য হয়> = আইওএস 10

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool

8

সুইফট 5 এবং আইওএস 12 এর সাহায্যে, এ এর ​​লিঙ্কগুলির সাথে আলাপচারিত করতে আপনি নিম্নলিখিত তিনটি ধরণের একটি ব্যবহার করতে পারেন UITextView


# 1 UITextViewএর dataDetectorTypesসম্পত্তি ব্যবহার করা ।

কোনওটিতে ফোন নম্বর, url বা ঠিকানাগুলির সাথে ইন্টারঅ্যাক্ট করার সহজ উপায় UITextViewহ'ল dataDetectorTypesসম্পত্তি ব্যবহার করা । নীচের নমুনা কোডটি কীভাবে এটি প্রয়োগ করতে হবে তা দেখায়। এই কোডটি দিয়ে, যখন ব্যবহারকারী ফোন নম্বরটিতে ট্যাপ করেন, তখন একটি UIAlertControllerপপ আপ হয়।

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textView = UITextView()
        textView.text = "Phone number: +33687654321"
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.dataDetectorTypes = [.phoneNumber]
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

}

# 2 UITextViewDelegateএর textView(_:shouldInteractWith:in:interaction:)পদ্ধতি ব্যবহার করে

আপনি UIAlertControllerযখন ব্যবহার করার সময় কোনও ফোন নম্বরটিতে ট্যাপ করেন তখন পপ আপ করার পরিবর্তে কিছু কাস্টম অ্যাকশন সম্পাদন করতে চান dataDetectorTypes, আপনাকে প্রোটোকল অনুসারে আপনার UIViewControllerরূপান্তর করতে হবে UITextViewDelegateএবং প্রয়োগ করতে হবে textView(_:shouldInteractWith:in:interaction:)। নীচের কোডটি কীভাবে এটি প্রয়োগ করতে হবে তা দেখায়:

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textView = UITextView()
        textView.delegate = self
        textView.text = "Phone number: +33687654321"
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.dataDetectorTypes = [.phoneNumber]
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        /* perform your own custom actions here */
        print(URL) // prints: "tel:+33687654321"

        return false // return true if you also want UIAlertController to pop up
    }

}

# 3 ব্যবহার NSAttributedStringএবংNSAttributedString.Key.link

বিকল্প হিসাবে, আপনি এর বৈশিষ্ট্যটির জন্য NSAttributedStringএকটি ব্যবহার এবং সেট করতে পারেন below নীচের নমুনা কোডটি URLএটির NSAttributedString.Key.linkএকটি সম্ভাব্য বাস্তবায়ন দেখায়। এই কোডটি সহ, ব্যবহারকারী যখন গুণিত স্ট্রিংটিতে ট্যাপ করেন তখন একটি UIAlertControllerপপ আপ হয়।

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let attributedString = NSMutableAttributedString(string: "Contact: ")
        let phoneUrl = NSURL(string: "tel:+33687654321")! // "telprompt://+33687654321" also works
        let attributes = [NSAttributedString.Key.link: phoneUrl]
        let phoneAttributedString = NSAttributedString(string: "phone number", attributes: attributes)
        attributedString.append(phoneAttributedString)

        let textView = UITextView()
        textView.attributedText = attributedString
        textView.isUserInteractionEnabled = true
        textView.isEditable = false
        textView.isSelectable = true
        textView.isScrollEnabled = false

        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        textView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        textView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    }

}

7

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

আপনার স্ট্যান্ডার্ড ইউআইটিেক্সটভিউ সেটআপটির মতো দেখতে কিছু হওয়া উচিত, প্রতিনিধি এবং ডেটা ডিটেক্টর টাইপগুলি ভুলে যাবেন না।

var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer
textView.text = "dsfadsaf www.google.com"
textView.selectable = true
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.delegate = self
addSubview(textView)

আপনার ক্লাস শেষ হওয়ার পরে এই টুকরোটি যুক্ত করুন:

class myVC: UIViewController {
    //viewdidload and other stuff here
}

extension MainCard: UITextViewDelegate {
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        //Do your stuff over here
        var webViewController = SVModalWebViewController(URL: URL)
        view.presentViewController(webViewController, animated: true, completion: nil)
        return false
    }
}

2

সুইফট 4:

1) নিম্নলিখিত ক্লাসটি তৈরি করুন (উপক্লাসযুক্ত ইউআইটিেক্সটভিউ):

import Foundation

protocol QuickDetectLinkTextViewDelegate: class {
    func tappedLink()
}

class QuickDetectLinkTextView: UITextView {

    var linkDetectDelegate: QuickDetectLinkTextViewDelegate?

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)

    }

    required init?(coder aDecoder: NSCoder) {
         super.init(coder: aDecoder)
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let glyphIndex: Int? = layoutManager.glyphIndex(for: point, in: textContainer, fractionOfDistanceThroughGlyph: nil)
        let index: Int? = layoutManager.characterIndexForGlyph(at: glyphIndex ?? 0)
        if let characterIndex = index {
            if characterIndex < textStorage.length {
                if textStorage.attribute(NSLinkAttributeName, at: characterIndex, effectiveRange: nil) != nil {
                    linkDetectDelegate?.tappedLink()
                    return self
                }
            }
        }

        return nil
    }
}


2) আপনি যেখানেই আপনার পাঠ্যদর্শনটি সেট আপ করেছেন, এটি করুন:

//init, viewDidLoad, etc
textView.linkDetectDelegate = self

//outlet
@IBOutlet weak var textView: QuickDetectLinkTextView!

//change ClassName to your class
extension ClassName: QuickDetectLinkTextViewDelegate {
    func tappedLink() {
        print("Tapped link, do something")
    }
}


আপনি যদি স্টোরিবোর্ড ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনার পাঠ্যদর্শনটি সঠিক ফলক সনাক্তকরণ পরিদর্শকের মতো দেখাচ্ছে:
এখানে চিত্র বর্ণনা লিখুন



ভয়েলা! ইউআরএল থাকা উচিত এর পরিবর্তে এখনই আপনি লিঙ্কটি ট্যাপ করুন তত্ক্ষণাত ইউআরএল পদ্ধতিতে


এছাড়াও: আপনি যদি ইউআরএলটি পরিচালনা না করতে চান তবে কেবল মিথ্যা প্রত্যাবর্তনের জন্য কাঁটাচামচ পদ্ধতিটি সেট করুন
জোশ ও'কনোর

ভাবুন এর মধ্যে অনেকগুলি সমস্যা রয়েছে যেমন আপনি যখন কোনও লিঙ্কটি ট্যাপ করবেন না তখন কী ঘটে। যেমন শূন্যস্থানটি ফিরে আসার পরে আমি মনে করি না যে পাঠ্যদর্শনটি আর স্বাভাবিকভাবে কাজ করবে। আপনি যখন কোনও লিঙ্কটি ট্যাপ করবেন তখন নির্বাচনটিও পরিবর্তিত হবে, কারণ সেই ক্ষেত্রে স্বতঃপ্রাপ্ত হবে।
ড্র ম্যাককর্ম্যাক

আমার জন্য দুর্দান্ত কাজ করে, আপনার প্রয়োজনের জন্য আপনাকে এ জাতীয় কেসগুলি পরিচালনা করতে হবে
জোশ ও'কনর

দুর্বল var লিংক ডিটেক্টডেলিগেট: কুইকডেক্টটলিঙ্কটেক্সটভিউডিলেজিট?
মাসলোভসা

@vyachaslav আমার জন্য নয়, আপনি নিশ্চয়ই কিছু ভুল করছেন
জোশ ও'কনর

0

আমি নিজে চেষ্টা করি নি তবে আপনি নিজের application:handleOpenURL:আবেদন প্রতিনিধিতে পদ্ধতিটি প্রয়োগের চেষ্টা করতে পারেন - দেখে মনে হচ্ছে সমস্ত openURLকলটি এই কলব্যাকের মধ্য দিয়ে গেছে।


0

আপনি কীভাবে সনাক্ত করা ডেটা লিঙ্কটি বা কী ধরণের ক্রিয়াকলাপ চালাতে হবে তা নিশ্চিত নয়। তবে আপনি পাঠ্যক্ষেত্রের মাধ্যমে পরীক্ষা / স্ক্যান চালানোর জন্য ডডবেইগইনএডিটিং টেক্সটফিল্ড পদ্ধতিটি ব্যবহার করতে সক্ষম হতে পারেন যদি আপনি নিজের সন্ধানের কী জানেন..যে ### - ### - #### ফর্ম্যাটটি পূরণ করে বা "www" দিয়ে শুরু করুন। এই ক্ষেত্রগুলি দখল করার জন্য, তবে আপনাকে পাঠ্যক্ষেত্রের স্ট্রিংয়ের মধ্য দিয়ে স্নিফ করার জন্য একটি সামান্য কোড লিখতে হবে, আপনার যা প্রয়োজন তা পুনরায় তৈরি করতে হবে এবং আপনার ফাংশনটির ব্যবহারের জন্য এটি এক্সট্রাক্ট করতে হবে। আমি মনে করি না যে এটি এতটা কঠিন হবে, একবার আপনি যখন যা চেয়েছিলেন ঠিক তেমন সঙ্কুচিত করে এবং তারপরে আপনার (যদি) বিবৃতিটি আপনার প্রয়োজনীয়তার খুব নির্দিষ্ট মেলানো প্যাটার্নে ফিল্টার করে দেয় তবে তা কেন্দ্রীভূত করুন।

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


0

application:handleOpenURL:যখন আপনার অ্যাপ্লিকেশন সমর্থন করে এমন একটি স্কিম দিয়ে একটি URL খোলার মাধ্যমে যখন অন্য অ্যাপ্লিকেশনটি আপনার অ্যাপ্লিকেশনটি খুলবে তখন ডাকা হয় । আপনার অ্যাপ্লিকেশনটি যখন কোনও ইউআরএল খুলতে শুরু করে তখন এটিকে বলা হয় না।

আমার মনে হয় ভ্লাদিমির যা চায় তা করার একমাত্র উপায় হ'ল ইউআইটিএক্সটভিউয়ের পরিবর্তে ইউআইবিউবভিউ ব্যবহার করা। আপনার ভিউ কন্ট্রোলারটিকে ইউআইওয়েবভিউডেলিগেটটি বাস্তবায়িত করুন, ইউআইউইউবভিউর প্রতিনিধিকে ভিউ কন্ট্রোলারে সেট করুন এবং ভিউ কন্ট্রোলারে আপনার অ্যাপ্লিকেশনটি ছাড়ার পরিবর্তে এবং মোবাইল সাফারিটিতে এটি খোলার পরিবর্তে একটি দৃশ্যে webView:shouldStartLoadWithRequest:navigationType:খোলার জন্য প্রয়োগ [request URL]করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.