Open
Description
Description
Hey @davdroman !
I have some report on CustomKeyboardKit that there are some performance implications on my library if used with an extensive amount of TextFields. (See: paescebu/CustomKeyboardKit#19)
After some digging I realized that this comes probably from the overhead that is necessary to make introspection even possible. So I doubt that this can be really improved but I'm giving it a shot to ask if there are some ideas laying around.
In short, the performance on this..
import SwiftUI
import SwiftUIIntrospect
import UIKit
struct ContentView: View {
@State private var showSheet = false
var body: some View {
VStack {
Button("Show Keyboard Sheet") {
showSheet.toggle()
}
.sheet(isPresented: $showSheet) {
KeyboardView()
}
}
}
}
struct KeyboardView: View {
@State private var strings = [
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
"31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
"41", "42", "43", "44", "45", "46", "47", "48", "49", "50",
"51", "52", "53", "54", "55", "56", "57", "58", "59", "60",
"61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
"71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
"81", "82", "83", "84", "85", "86", "87", "88", "89", "90",
"91", "92", "93", "94", "95", "96", "97", "98", "99", "100",
"101", "102", "103", "104", "105", "106", "107", "108", "109", "110",
"111", "112", "113", "114", "115", "116", "117", "118", "119", "120",
"121", "122", "123", "124", "125", "126", "127", "128", "129", "130",
"131", "132", "133", "134", "135", "136", "137", "138", "139", "140",
"141", "142", "143", "144", "145", "146", "147", "148", "149", "150",
"151", "152", "153", "154", "155", "156", "157", "158", "159", "160",
"161", "162", "163", "164", "165", "166", "167", "168", "169", "170",
"171", "172", "173", "174", "175", "176", "177", "178", "179", "180",
"181", "182", "183", "184", "185", "186", "187", "188", "189", "190",
"191", "192", "193", "194", "195", "196", "197", "198", "199", "200"
]
var body: some View {
ScrollView {
ForEach($strings, id: \.self) { $val in
TextField("", text: $val)
.introspect(.textField, on: .iOS(.v17)) { textField in
//do nothing
}
.padding()
.background {
RoundedRectangle(cornerRadius: 8)
.fill(.gray)
}
}
}
.contentMargins(.all, 16)
}
}
...is much worse than this:
import SwiftUI
import SwiftUIIntrospect
import UIKit
struct ContentView: View {
@State private var showSheet = false
var body: some View {
VStack {
Button("Show Keyboard Sheet") {
showSheet.toggle()
}
.sheet(isPresented: $showSheet) {
KeyboardView()
}
}
}
}
struct KeyboardView: View {
@State private var strings = [
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
"31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
"41", "42", "43", "44", "45", "46", "47", "48", "49", "50",
"51", "52", "53", "54", "55", "56", "57", "58", "59", "60",
"61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
"71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
"81", "82", "83", "84", "85", "86", "87", "88", "89", "90",
"91", "92", "93", "94", "95", "96", "97", "98", "99", "100",
"101", "102", "103", "104", "105", "106", "107", "108", "109", "110",
"111", "112", "113", "114", "115", "116", "117", "118", "119", "120",
"121", "122", "123", "124", "125", "126", "127", "128", "129", "130",
"131", "132", "133", "134", "135", "136", "137", "138", "139", "140",
"141", "142", "143", "144", "145", "146", "147", "148", "149", "150",
"151", "152", "153", "154", "155", "156", "157", "158", "159", "160",
"161", "162", "163", "164", "165", "166", "167", "168", "169", "170",
"171", "172", "173", "174", "175", "176", "177", "178", "179", "180",
"181", "182", "183", "184", "185", "186", "187", "188", "189", "190",
"191", "192", "193", "194", "195", "196", "197", "198", "199", "200"
]
var body: some View {
ScrollView {
ForEach($strings, id: \.self) { $val in
TextField("", text: $val)
.padding()
.background {
RoundedRectangle(cornerRadius: 8)
.fill(.gray)
}
}
}
.contentMargins(.all, 16)
}
}
Or do you have any idea how this can be worked around without using the introspection capability?