2017-02-02 2 views
0

ersetzen werde ich eine Menge NachrichtenketteWie spezifischen Strings NSTextAttachment für Bild anzeigen

Wie diese bekommen:

1.hello {{http://i.imgur.com/f1cqT3ut.jpg}} world {{http://i.imgur.com/f1cqT3ut.jpg}}

2.hi {{http://i.imgur.com/iVx9iqjt.jpg}} {{http://i.imgur.com/iVx9iqjt.jpg}} how {{http://i.imgur.com/ZpXgxiXt.jpg}} are {{http://i.imgur.com/rcdHObKt.jpg}} you {{http://i.imgur.com/yX5dHdet.jpg}} ? {{http://i.imgur.com/2iZSBKGt.jpg}}

Und ich möchte diese Nachrichten verarbeiten

Wie diese:

1. message handled 1

2. message handled 2

Jetzt weiß ich, kann nur NSMutableAttributedString verwenden, um alle behandelten Nachrichten anzuzeigen und zu verwenden NSTextAttachment die URL Bilder zu zeigen.

Aber ich weiß nicht, wie Sie diese Nachrichten ersetzen und behandeln.

Hilf mir bitte.

Danke.

Antwort

0

Wenn Sie davon ausgehen können, dass jeder String so aufgebaut wird, wo die Wörter und URLs durch Leerzeichen getrennt sind - und die URLs alle in zwei geschweiften Klammern enthalten sind, könnten Sie eine Methode erstellen, die dann a string und teile es in ein Array von Teilstrings auf (getrennt durch Leerzeichen), dann kannst du nach einem Teilstring suchen, der mit "{{" beginnt, um zu wissen, dass es eine URL ist. Ich habe so etwas geschrieben, das ein Array von Tupeln zurückgibt, wobei jedes Tupel eine Ganzzahl ist (die mit dem Index der URL innerhalb des Arrays von Teilstrings korreliert), und eine Zeichenfolge, die die aus den geschweiften Klammern entfernte URL darstellt.

func split(_ s: String) -> [(Int, String)] { 

    // Separate the original string into an array of substrings separated by a space 
    let separated = s.components(separatedBy: " ") 
    // Filter the separated array to find the URLs that start with {{ 
    var urls = separated.filter{ $0.hasPrefix("{{") } 
    // Map the urls array to get an array of ints correlating to their respective indices from the separated array 
    let indicies = urls.map { separated.index(of: $0) } 
    // create an empty array of Int and String tuples 
    var tuples: [(Int, String)] = [] 

    // Loop through the url array 
    for i in 0 ..< urls .count { 

     // Remove the left side (open) curly brackets 
     urls[i] = urls[i].replacingOccurrences(of: "{{", with: "") 
     // Remove the right side (close) curly brackets 
     urls[i] = urls[i].replacingOccurrences(of: "}}", with: "") 

     // Append the tuple with the url's index from the separated array and it's actual url value as a string 
     tuples.append((indicies[i]!, urls [i])) 
    } 
    return tuples 
} 

Sie dann diese verwenden konnten die Worte von dem Urls zu spalten, und holen dann die Bilder (das bis zu Ihnen sein würde - vielleicht Alamofire verwenden oder auch nur NSURLSession) und dann, da Sie ihren ursprünglichen Index aus Das Array der Teilstrings - Sie wissen immer noch, in welcher Reihenfolge sie angeordnet sind. Ordnen Sie sie also nach der ursprünglichen Reihenfolge neu an, sobald die asynchrone Anfrage zurückkommt, und verwenden Sie dann (oder umgekehrt), um den Inhalt in der wie du es versuchst.

+0

vielen Dank. Ich sah die Tupel hat URLs Index und URL, aber wie man diese Tupel verwenden, um eine komplette NSMutableAttributedString zu bilden? Ich verstehe nicht ganz, sorry><" – DanielTing

+0

Ich fand einen Fehler, wenn die URLs gleiche URL ist, wird Indicies immer habe den ersten gefunden ... – DanielTing

0
 let fullString = NSMutableAttributedString(string : "start of text") 
    let image1Attachment = NSTextAttachment() 
    image1Attachment.image = UIImage(named : "image name") 
    let image1String = NSAttributedString(attachment: image1Attachment) 

    fullString.append(image1String) 
    fullString.append(NSAttributedString(string: "End of text")) 

    yourLabel.attributedText = fullString 

Dieser Code soll einen Weg zeigen, den Sie wollen.Verwenden Sie als Referenz Code wie Sie benötigen.

Verwandte Themen