আমি কীভাবে এনএসএট্রিবিউটেড স্ট্রিংসকে সম্মতি জানাতে পারি?


158

আমার কিছু স্ট্রিং সন্ধান করতে হবে এবং স্ট্রিংগুলিকে মার্জ করার আগে কিছু বৈশিষ্ট্য নির্ধারণ করতে হবে, সুতরাং এনএসএসআরটিংস থাকা -> সেগুলি কনটেনেট করুন -> এনএসএট্রিবিউটেড স্ট্রিং কোনও বিকল্প নয়, অন্য বৈশিষ্ট্যযুক্ত স্ট্রিংকে অ্যাট্রিবিউটস্ট্রিং যুক্ত করার কোনও উপায় আছে কি?


13
এটা তোলে হাস্যকর কতটা কঠিন এই হল এখনও 2016. সালের আগস্ট মাসে হয়
কীলক মার্টিন

17
এমনকি 2018 সালে ...
DehMotth

11
এখনও 2019 সালে;)
রাইসটলিন

8
এখনও 2020 এ ...
হাওয়ানঘো কিম

উত্তর:


210

আমি আপনাকে @ লিনাক্সিয়োস প্রস্তাবিত একটি একক পরিবর্তিত গুণযুক্ত স্ট্রিং ব্যবহার করার পরামর্শ দিচ্ছি এবং এর আরও একটি উদাহরণ এখানে:

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];

তবে, কেবলমাত্র সেখানে সমস্ত বিকল্প বের করার জন্য, আপনি ইতিমধ্যে একসাথে রেখে দেওয়া ইনপুট স্ট্রিংযুক্ত একটি ফরম্যাটযুক্ত এনএসএস স্ট্রিং থেকে তৈরি একটি একক মিউটেটেবল অ্যাট্রিবিউটেড স্ট্রিংও তৈরি করতে পারেন। এরপরে আপনি addAttributes: range:ইনপুট স্ট্রিংগুলি ধারণ করে এমন পরিসরে যুক্ত হওয়ার পরে বৈশিষ্ট্যগুলি যুক্ত করতে ব্যবহার করতে পারেন। আমি যদিও আগের উপায় প্রস্তাব।


আপনি গুণাবলী যুক্ত করার পরিবর্তে স্ট্রিংগুলি যুক্ত করার পরামর্শ দিচ্ছেন কেন?
ma11 She28

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
পরিবর্তনীয় শ্রেণি অপরিবর্তনীয় শ্রেণির একটি উপপ্রকার।
অ্যালগাল

4
আপনি যে কোনও প্রসঙ্গে পরিবর্তনীয় উপ-প্রকার ব্যবহার করতে পারেন যা অপরিবর্তনীয় পিতামাতার ধরণের প্রত্যাশা করে তবে বিপরীত নয়। আপনি সাবক্লাসিং এবং উত্তরাধিকার পর্যালোচনা করতে চাইতে পারেন।
অ্যালগাল

6
হ্যাঁ, আপনি যদি প্রতিরক্ষামূলক হতে চান তবে আপনার একটি প্রতিরক্ষামূলক অনুলিপি করা উচিত। (না বিদ্রূপ।)
algal

1
আপনি যদি সত্যিই এনএসএট্রিবিউটেড স্ট্রিংটি ফিরে আসতে চান তবে সম্ভবত এটি কাজ করবে:return NSAttributedString(attributedString: result)
অ্যালেক্স

2
@ N13 আমি একটি ফোল্ডার নামক তৈরি করবে Helpersবা Extensionsএবং নামে একটি ফাইলে এই ফাংশন করা NSAttributedString+Concatenate.swift
ডেভিড লসন

34

সুইফট 3: কেবল একটি এনএসগত পরিবর্তনযোগ্য স্ট্রিং তৈরি করুন এবং তাদের কাছে বিশিষ্ট স্ট্রিং যুক্ত করুন।

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

swift5 আপডেট:

    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

@ জেডাব্লুওয়ালকার আপনার 'অনেলাইনার' দূষিত। আপনি এই "কনটেনটেশন" ফলাফলটি পেতে পারেন না কারণ অ্যাপেনডেট্রিবিউটেড স্ট্রিং স্ট্রিং ফেরায় না। অভিধান সহ একই গল্প
গৌসব্লুরিনিক

@ গাউসব্লুরিনিক: ভাল কথা, অবশ্যই আপনার সমালোচনা আমরা যে মন্তব্যে মন্তব্য করছি তার উত্তরের ক্ষেত্রেও প্রযোজ্য। এটা হওয়া উচিত NSMutableAttributedString* aString3 = [aString1 mutableCopy]; [aString3 appendAttributedString: aString2];
JWWalker

@ গাউসব্লুরিনিক, জেওয়ালকার: উত্তরটি সংশোধন করেছেন।
লিনাকিনিও

@ লিনাক্সিসও, আপনি resultহিসাবে ফিরে আসছেন NSMutableAttributedString। লেখক এটি দেখতে চান না। stringByAppendingString- এই পদ্ধতিটি ভাল হবে
gauussblurinc

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 ব্যবহার করছি এবং আমি দু'টি এনএসএআউটআরস্ট্রিং একসাথে যুক্ত করতে পারি না ...
পলডোসদেভ

1
স্ট্রেঞ্জ। এই ক্ষেত্রে কেবল ব্যবহার করুনNSAttrStr1.append(NSAttrStr2)
অ্যান্ড্রু

মাত্র দুটি এনএসএটিআরএসটিংস যুক্ত করার জন্য এক্সটেনশনের সাথে আমার উত্তর আপডেট করেছে :)
অ্যান্ড্রু

4

আপনি যদি কোকোপড ব্যবহার করছেন, উপরের উত্তরগুলির একটি বিকল্প যা আপনাকে নিজের কোডে পরিবর্তন আনতে দেয় সেগুলি হল এমন এনএসএট্রিবিউটেড স্ট্রিং + সিসিএল ফর্ম্যাট বিভাগটি 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

আপনি সুইফটি ফরম্যাট চেষ্টা করতে পারেন এটি নিম্নলিখিত বাক্য গঠন ব্যবহার করে

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

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