मैं एक सबस्ट्रिंग को जिम्मेदार स्ट्रिंग के साथ बदलने की कोशिश कर रहा हूं। मेरा कोड निम्नलिखित है।

let searchText = self.searchBar.text!
let name = item.firstName ?? ""
let idNo = "Employee Id. \(item.employeeId ?? "NA")"

if let range = name.range(of: searchText, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)
{
    let attributedSubString = NSAttributedString.init(string: name.substring(with: range), attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
    let normalNameString = NSMutableAttributedString.init(string: name)
    normalNameString.mutableString.replacingCharacters(in: range, with: attributedSubString)
    cell.name.attributedText = normalNameString
}
else
{
    cell.name.text = name
}

मुझे संकलन समय त्रुटि मिल रही है:

"प्रकार 'रेंज' (उर्फ 'रेंज') के मान को अपेक्षित तर्क प्रकार 'NSRange' (उर्फ '_NSRange') में परिवर्तित नहीं कर सकता"।

मुझे यहां क्या बदलना चाहिए?

14
Bharath Reddy 15 सितंबर 2017, 08:13

4 जवाब

सबसे बढ़िया उत्तर

आप NSString और NSRange का उपयोग कर सकते हैं, साथ ही आपको इस लाइन को बदलने की आवश्यकता है normalNameString.mutableString.replacingCharacters(in: range, with: attributedSubString) और इसके बजाय इसका उपयोग करें normalNameString.replaceCharacters(in: nsRange, with: attributedSubString) क्योंकि mutableString NSMutableString है, और replacingCharacters स्ट्रिंग की अपेक्षा करें न कि NSAttributtedString

पूर्ण कोड (स्विफ्ट5 के लिए अपडेट किया गया)

    let nsRange = NSString(string: name).range(of: searchText, options: String.CompareOptions.caseInsensitive)

    if nsRange.location != NSNotFound
    {
        let attributedSubString = NSAttributedString.init(string: NSString(string: name).substring(with: nsRange), attributes: [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 17)])
        let normalNameString = NSMutableAttributedString.init(string: name)
        normalNameString.replaceCharacters(in: nsRange, with: attributedSubString)
        cell.name.attributedText = normalNameString
    }
    else
    {
        cell.name.text = name
    }
21
Reinier Melian 17 जुलाई 2019, 15:29

आपको नीचे दिए गए Range<String.index> lowerBound और UpperBound स्थिति मानों का उपयोग करके NSRange उदाहरण बनाना होगा।

let searchText = "Kiran"
let name = "Kiran Jasvanee"
let idNo = "Employee Id. \("24")"

if let range = name.range(of: searchText, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)
{
    let attributedSubString = NSAttributedString.init(string: name.substring(with: range), attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
    let normalNameString = NSMutableAttributedString.init(string: name)

    let startPos = name.distance(from: searchText.characters.startIndex, to: range.lowerBound)
    let nsrange = NSMakeRange(startPos, searchText.characters.count)

    normalNameString.replaceCharacters(in: nsrange, with: attributedSubString)
    labelName.attributedText = normalNameString
}
else
{
    labelName.text = name
}  

searchtext constant और
में "Kiran" के बजाय self.searchBar.text! जोड़ें अपनी आवश्यकता के अनुसार name constant में "Kiran Jasvanee" के बजाय item.firstName ?? "" जोड़ें।

मैंने इसे डेमो में आजमाया है, और कोड मैंने नीचे ठीक काम कर पोस्ट किया है। कृपया जांचें।
यहां छवि विवरण दर्ज करें

अगर name = "AKiranJasvanee"
यहां छवि विवरण दर्ज करें
अगर name = "KiranJasvanee"
यहां छवि विवरण दर्ज करें

2
Kiran Jasvanee 15 सितंबर 2017, 10:16

स्विफ्ट में Range एक NSRange प्रकार नहीं है। यहां आप स्विफ्ट Range टाइप कर रहे हैं जहां NSRange अपेक्षित है, कि आपको त्रुटि क्यों मिली।

एक समाधान यह हो सकता है कि आप अपने name को NSString पर NSRange प्रकार की श्रेणी प्राप्त करने के लिए इस तरह डाल सकते हैं:

let range = (name as NSString).range(of: searchText, options: String.CompareOptions.caseInsensitive)

let subString = NSString(string: name).substring(with: range)
let attributedSubString = NSAttributedString.init(string:subString, attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
let normalNameString = NSMutableAttributedString.init(string: name)
normalNameString.replaceCharacters(in: range, with: attributedSubString)
-1
Jitendra Solanki 15 सितंबर 2017, 09:06

कृपया ऐसा करें,

प्रथम,

extension String {

    func nsRange(from range: Range<String.Index>) -> NSRange {
        let from = range.lowerBound.samePosition(in: utf16)
        let to = range.upperBound.samePosition(in: utf16)
        return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),
                       length: utf16.distance(from: from, to: to))
    }
}

उसके बाद आपके पास एक लेबल और स्ट्रिंग है,

private func setAttributedLabel() {

    let lableText = UILabel()

    let strTitle = "Basic string Double tap" // your main string
    let title:NSMutableAttributedString = NSMutableAttributedString(string: strTitle)

    // give attribute to basic string
    title.addAttributes([NSForegroundColorAttributeName:UIColor.blue ,NSFontAttributeName:UIFont.boldSystemFont(ofSize: 15)], range: NSRange.init(location: 0, length: title.length))
    lableText.attributedText = title

    // give attribute to your range string
    let rangeOfString = lableText.text?.range(of: "Double tap") // this string is subString of strTitle
    title.addAttributes([NSForegroundColorAttributeName:UIColor.gray,NSFontAttributeName:UIFont.systemFont(ofSize: 15)], range: strTitle.nsRange(from: rangeOfString!))
    lableText.attributedText = title

}

मुझे उम्मीद है इससे मदद मिलेगी।

5
vikas prajapati 15 सितंबर 2017, 09:34