0

I am using AttributedString in SwiftUI (Mac application) to customize the appearance of portions of a long string. I'm displaying the text formatted successfully and it appears correct.

My code looks like this:

struct TextView: View {
    var body: some View {
        ScrollView {
            Text(tag())
        }.padding()
        
    }
    func tag() -> AttributedString {
       // code which creates the attributed string and applies formatting to various locations
    }
}

At this point I want to add "touch points" ("interactive points") to the text (imagine hyperlinks) which will provide additional information when particular locations (pieces of text) are interacted with.

Ive seen some similar questions describing usage (or combinations) of NSTextAttachment , NSAttributedStringKey.link , UITextViewDelegate

see:

NSAttributedString click event in UILabel using Swift

but this isn't (or at least not obvious) the idiomatic "SwiftUI" way and seems cumbersome.

I would want to tag the string with the formatting while adding the "Attachment" which can be recognized in the view event handler:

func tag() -> AttributedString {
    // loose for this example
    var attributedString = AttributedString("My string which is very long")
    for range in getRangesOfAttributes {
       attributedString[range].foregroundColor = getRandomColor()
       attributedString[range].attachment = Attachment() <<<<<<< this is missing, how do I tag this portion and recognize when it got interacted with in the View
    }
}

func getRangesOfAttributes() -> ClosedRange<AttributedString.Index> {
 ... returns a bunch of ranges which need to be tagged
}


// the view can now do something once the attachment is clicked
var body: View {
   Text(tag())
      .onClickOfAttachment(...) // <<<< This is contrived, how can I do this?
}

Avba
  • 13,954
  • 15
  • 87
  • 165
  • SwiftUI supports only limited set of attributes for AttributedString ([see here](https://stackoverflow.com/a/70746856/12299030)), `attachment` is out of scope. So for now ... back to UIKit representable. – Asperi Apr 28 '22 at 11:01

0 Answers0