SwiftUI TextField selection - strange initial values with iOS

When using a TextField with axis to set to .vertical on iOS, it sets a bound selection parameter to an erroneous value. Whilst on MacOS it performs as expected.

Take the following code:

import SwiftUI

@main
struct SelectionTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
	@FocusState private var isFocused: Bool
	@State private var text = ""
	@State private var textSelection: TextSelection? = nil
	
    var body: some View {
		TextField("Label", text: $text, selection: $textSelection, axis: .vertical)
		.onChange(of: textSelection, initial: true) {
			if let textSelection {
				print("textSelection = \(textSelection)")
			} else {
				print("textSelection = nil")
			}
		}
		.focused($isFocused)
		.task {
			isFocused = true
		}
    }
}

Running this on MacOS target gives the following on the console:

textSelection = nil
textSelection = TextSelection(indices: SwiftUI.TextSelection.Indices.selection(Range(0[any]..<0[any])), affinity: SwiftUI.TextSelectionAffinity.downstream)

Running the code on iOS gives:

textSelection = TextSelection(indices: SwiftUI.TextSelection.Indices.selection(Range(1[any]..<1[any])), affinity: SwiftUI.TextSelectionAffinity.upstream)
textSelection = TextSelection(indices: SwiftUI.TextSelection.Indices.selection(Range(1[any]..<1[any])), affinity: SwiftUI.TextSelectionAffinity.upstream)

Note here the range is 1..<1 - which is incorrect.

Also of side interest this behaviour changes if you remove the axis parameter:

textSelection = nil

Am I missing something, or is this a bug?

Do you have a feedback report yet? If not, would you mind to file one for us and share your report ID here? Thanks.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

I've logged this issue: FB20851540

SwiftUI TextField selection - strange initial values with iOS
 
 
Q