मैं NSAttributedStrings को कैसे व्यवस्थित कर सकता हूं?


158

मुझे स्ट्रिंग्स को मर्ज करने से पहले कुछ स्ट्रिंग्स की खोज करने और कुछ विशेषताओं को सेट करने की आवश्यकता है, इसलिए NSStrings -> उन्हें सम्‍मिलित करें -> NSAttributedString बनाना कोई विकल्‍प नहीं है, क्‍या कोई श्रेय सम्‍मिलित करने का कोई तरीका है जो किसी अन्‍य स्‍ट्राइगर्ड स्ट्रिंग के लिए है?


13
यह हास्यास्पद है कि यह अभी भी 2016 के अगस्त में कितना मुश्किल है।
वेज मार्टिन

17
2018 में भी ...
देहमोठ

11
अभी भी 2019 में;)
11

8
अभी भी 2020 में ...
ह्वांगहो किम

जवाबों:


210

मैं आपको एक एकल उत्परिवर्तित स्ट्रिंग स्ट्रिंग का उपयोग करने की सलाह दूंगा @Linuxios ने सुझाव दिया, और यहां इसका एक और उदाहरण दिया गया है:

NSMutableAttributedString *mutableAttString = [[NSMutableAttributedString alloc] init];

NSString *plainString = // ...
NSDictionary *attributes = // ... a dictionary with your attributes.
NSAttributedString *newAttString = [[NSAttributedString alloc] initWithString:plainString attributes:attributes];

[mutableAttString appendAttributedString:newAttString];

हालाँकि, वहाँ सभी विकल्पों को प्राप्त करने के लिए, आप एक एकल उत्परिवर्तित स्ट्रिंग भी बना सकते हैं, जो एक स्वरूपित NSString से बना है जिसमें पहले से ही डाले गए इनपुट स्ट्रिंग्स होते हैं। आप तब addAttributes: range:इनपुट स्ट्रिंग्स वाले पर्वतमाला के तथ्य के बाद विशेषताओं को जोड़ने के लिए उपयोग कर सकते हैं। मैं हालांकि पूर्व के तरीके की सिफारिश करता हूं।


आप विशेषताओं को जोड़ने के बजाय तार जोड़ने की सलाह क्यों देते हैं?
ma11hew28

86

यदि आप स्विफ्ट का उपयोग कर रहे हैं, तो आप बस +ऑपरेटर को अधिभारित कर सकते हैं ताकि आप उन्हें उसी तरह से बदल सकें जैसे कि आप सामान्य तारों को समेटते हैं:

// concatenate attributed strings
func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString
{
    let result = NSMutableAttributedString()
    result.append(left)
    result.append(right)
    return result
}

अब आप उन्हें जोड़कर उन्हें संक्षिप्त कर सकते हैं:

let helloworld = NSAttributedString(string: "Hello ") + NSAttributedString(string: "World")

5
उत्परिवर्तित वर्ग अपरिवर्तनीय वर्ग का एक उपप्रकार है।
algal

4
आप किसी भी संदर्भ में उत्परिवर्तनीय उपप्रकार का उपयोग कर सकते हैं जो अपरिवर्तनीय मूल प्रकार की अपेक्षा करता है लेकिन इसके विपरीत नहीं। आप उपवर्ग और वंशानुक्रम की समीक्षा करना चाहते हैं।
शैवाल

6
यदि आप रक्षात्मक होना चाहते हैं, तो हाँ, आपको एक रक्षात्मक प्रति चाहिए। (नहीं व्यंग्य।)
शैवाल

1
यदि आप वास्तव में NSAttributedString को वापस करना चाहते हैं, तो शायद यह काम करेगा:return NSAttributedString(attributedString: result)
एलेक्स

2
@ n13 मैं नामक एक फ़ोल्डर बनाऊंगा Helpersया Extensionsइस फ़ंक्शन को नामित फ़ाइल में डालूँगा NSAttributedString+Concatenate.swift
डेविड लॉसन

34

स्विफ्ट 3: बस एक NSMutableAttributedString बनाएं और उनके लिए जिम्मेदार स्ट्रिंग्स को जोड़ें।

let mutableAttributedString = NSMutableAttributedString()

let boldAttribute = [
    NSFontAttributeName: UIFont(name: "GothamPro-Medium", size: 13)!,
    NSForegroundColorAttributeName: Constants.defaultBlackColor
]

let regularAttribute = [
    NSFontAttributeName: UIFont(name: "Gotham Pro", size: 13)!,
    NSForegroundColorAttributeName: Constants.defaultBlackColor
]

let boldAttributedString = NSAttributedString(string: "Warning: ", attributes: boldAttribute)
let regularAttributedString = NSAttributedString(string: "All tasks within this project will be deleted.  If you're sure you want to delete all tasks and this project, type DELETE to confirm.", attributes: regularAttribute)
mutableAttributedString.append(boldAttributedString)
mutableAttributedString.append(regularAttributedString)

descriptionTextView.attributedText = mutableAttributedString

स्विफ्ट 5 अपडेट:

    let captionAttribute = [
        NSAttributedString.Key.font: Font.captionsRegular,
        NSAttributedString.Key.foregroundColor: UIColor.appGray
    ]

25

इसे इस्तेमाल करे:

NSMutableAttributedString* result = [astring1 mutableCopy];
[result appendAttributedString:astring2];

कहां astring1और कहां astring2हैं NSAttributedString


13
या [[aString1 mutableCopy] appendAttributedString: aString2]
JWWalker

@JWWalker आपका 'ऑनलाइनर' दूषित है। क्योंकि आप appendAttributedString स्ट्रिंग वापस नहीं करता है क्योंकि आप इस "संघनन" परिणाम प्राप्त नहीं कर सकते। शब्दकोशों के साथ एक ही कहानी
gaussblurinc

@gaussblurinc: अच्छी बात है, निश्चित रूप से आपकी आलोचना उस उत्तर पर भी लागू होती है जिस पर हम टिप्पणी कर रहे हैं। यह होना चाहिए NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];
JWWalker

@gaussblurinc, JWalker: उत्तर को ठीक किया।
लिनक्स

@Linuxios, भी, आप के resultरूप में वापसी NSMutableAttributedString। यह वह नहीं है जिसे लेखक देखना चाहता है। stringByAppendingString- यह विधि अच्छी होगी
गॉसब्लार्की 26

5

2020 | स्विफ्ट 5.1:

आप NSMutableAttributedStringनिम्नलिखित तरीके से 2 जोड़ सकते हैं :

let concatenated = NSAttrStr1.append(NSAttrStr2)

एक और तरीका है के साथ काम करता NSMutableAttributedStringहै और NSAttributedStringदोनों:

[NSAttrStr1, NSAttrStr2].joinWith(separator: "")

एक और तरीका है ...।

var full = NSAttrStr1 + NSAttrStr2 + NSAttrStr3

तथा:

var full = NSMutableAttributedString(string: "hello ")
// NSAttrStr1 == 1


full += NSAttrStr1 // full == "hello 1"       
full += " world"   // full == "hello 1 world"

आप इसे निम्न एक्सटेंशन के साथ कर सकते हैं:

// works with NSAttributedString and NSMutableAttributedString!
public extension NSAttributedString {
    static func + (left: NSAttributedString, right: NSAttributedString) -> NSAttributedString {
        let leftCopy = NSMutableAttributedString(attributedString: left)
        leftCopy.append(right)
        return leftCopy
    }

    static func + (left: NSAttributedString, right: String) -> NSAttributedString {
        let leftCopy = NSMutableAttributedString(attributedString: left)
        let rightAttr = NSMutableAttributedString(string: right)
        leftCopy.append(rightAttr)
        return leftCopy
    }

    static func + (left: String, right: NSAttributedString) -> NSAttributedString {
        let leftAttr = NSMutableAttributedString(string: left)
        leftAttr.append(right)
        return leftAttr
    }
}

public extension NSMutableAttributedString {
    static func += (left: NSMutableAttributedString, right: String) -> NSMutableAttributedString {
        let rightAttr = NSMutableAttributedString(string: right)
        left.append(rightAttr)
        return left
    }

    static func += (left: NSMutableAttributedString, right: NSAttributedString) -> NSMutableAttributedString {
        left.append(right)
        return left
    }
}

2
मैं स्विफ्ट 5.1 का उपयोग कर रहा हूं और मैं सिर्फ दो NSAttrStrings को एक साथ जोड़ नहीं सकता ...
PaulDoesDev

1
अजीब। इस मामले में बस का उपयोग करेंNSAttrStr1.append(NSAttrStr2)
एंड्रयू

केवल दो NSAttrStrings :) जोड़ने के लिए एक्सटेंशन के साथ मेरे उत्तर को अपडेट किया गया है
एंड्रयू

4

यदि आप Cocoapods का उपयोग कर रहे हैं, तो उपरोक्त दोनों उत्तरों का एक विकल्प जो आपको अपने स्वयं के कोड में परिवर्तनशीलता से बचने देता है, वह है उत्कृष्ट NSAttributedString + CCLFormat श्रेणी का उपयोग करने के लिए NSAttributedStringजो आपको कुछ लिखने देता है:

NSAttributedString *first = ...;
NSAttributedString *second = ...;
NSAttributedString *combined = [NSAttributedString attributedStringWithFormat:@"%@%@", first, second];

बेशक यह सिर्फ NSMutableAttributedStringकवर के तहत उपयोग करता है ।

इसका पूर्ण रूप से विकसित प्रारूपण कार्य होने का अतिरिक्त लाभ भी है - इसलिए यह एक साथ तार जोड़ने की तुलना में बहुत अधिक कर सकता है।


1
// Immutable approach
// class method

+ (NSAttributedString *)stringByAppendingString:(NSAttributedString *)append toString:(NSAttributedString *)string {
  NSMutableAttributedString *result = [string mutableCopy];
  [result appendAttributedString:append];
  NSAttributedString *copy = [result copy];
  return copy;
}

//Instance method
- (NSAttributedString *)stringByAppendingString:(NSAttributedString *)append {
  NSMutableAttributedString *result = [self mutableCopy];
  [result appendAttributedString:append];
  NSAttributedString *copy = [result copy];
  return copy;
}

1

आप SwiftyFormat की कोशिश कर सकते हैं यह सिंटैक्स का उपयोग करता है

let format = "#{{user}} mentioned you in a comment. #{{comment}}"
let message = NSAttributedString(format: format,
                                 attributes: commonAttributes,
                                 mapping: ["user": attributedName, "comment": attributedComment])

1
क्या आप इसे और अधिक विस्तृत कर सकते हैं?
कांधल भूटिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.