0

I'm trying to implement a UITextView using the following UIViewRepresentable

import Foundation
import SwiftUI

struct TextView: UIViewRepresentable {
    @Binding var text: String
    var _editable : Bool = true

    func makeUIView(context: Context) -> UITextView {
        let result = UITextView()
        let font = UIFont(name: "Menlo",size: 18)
        result.font = font

        return result
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
        uiView.isEditable = _editable
    }

    mutating func editable(_ editable: Bool) -> TextView {
        _editable = editable
        return self
    }
}

You will notice the mutating func editable that I would like to use in my SwiftUI struct like this :

        return ZStack(alignment: Alignment.trailing) {
            TextView(text: Binding($note.content)!)
                .editable(true) // <<<< Here
            VStack {
                Text(dateString)
                    .font(.caption)
                    .foregroundColor(Color.gray)
                    .padding(3)
                Spacer()
            }
        }

But the following exception is thrown :

Cannot use mutating member on immutable value: function call returns immutable value

Screenshot

I suspect that UIViewRepresentable isn't mutable, and wondering if there is a way around it

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Yann Bizeul
  • 403
  • 3
  • 10

1 Answers1

2

These "chained methods" are not supposed to be mutating. If you look at the methods that you can chain in the SwiftUI framework, none of them are marked mutating. Quick example.

These methods are supposed to return a new instance of the struct, with some property changed.

i.e. like this:

func editable(_ editable: Bool) -> TextView {
    // This is a new instance of the struct, but _editable is changed to the new value
    TextView(text: $text, _editable: editable) 
}
Sweeper
  • 213,210
  • 22
  • 193
  • 313