頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


SwiftUIのTextFieldがSonomaにしたら動かなくなった

「CSVから宛名印刷」というmacOSアプリのユーザーさんから「数値の入力ができない」と連絡がありまして、、、
そんなアホな?!と思いつつ調べたところ、どうやらそのユーザーさんのmacOSがSonomaでした。その頃はまだ自分は様子見でSonomaにしていない状態だったのですが、原因が他に思いつかなかったので、試しにSonomaにアップデートしたところ、見事に不具合が再現されました。
問題の箇所はこんな感じのTextFieldです。
TextField("x[mm]", value: binding_offsetX, 
formatter: numberFormatter2 , onEditingChanged: { (editingChanged) in
})

TextFieldにはいろんなイニシャライザがあるのですが、上記のはリファレンスにはなくて、deprecatedになってた、、、Xcode!教えてよ!

Deprecated
Use init(_:value:formatter:prompt:) instead. Add the onSubmit(of:_:) view modifier for the onCommit behavior. Use FocusState and focused(_:equals:) for the onEditingChanged behavior.


↑deprecatedなので今後はこういうの使ってね、とあるのでその通り↓このような形式で書き直しました。
TextField("x[mm]", value: binding_offsetX, formatter: numberFormatter2)
.focused($offsetXFieldIsFocused)
.onSubmit {
}
.onChange(of: offsetXFieldIsFocused) { newValue in
}

また、別なmacOSアプリ(AppPreview Editor)でも同様の不具合が発生したのですが、こちらはいろんな理由(値を保存するとか、undo/redoを有効にするとか)で上記のコードでは不十分でしたので、以下のようにしました。
import Combine

@State private var strokeWidthString: String = ""

TextField("", text: $strokeWidthString, onCommit: {
newMaterial .text_strokeWidth = value
viewModel.save([newMaterial], undoManager: undoManager)
})
.onReceive(viewModel.$model, perform: { value in
strokeWidthString = value.hoge
})
.onReceive(Just(strokeWidthString), perform: { newValue in
let filtered = newValue.retainNumericCharacters
if filtered != newValue {
strokeWidthString = filtered
}
})
だいぶはしょってるけど、こんな感じで記述しています。
ちなみにBing AIに教えてもらいました。ホント助かるわあ〜
スポンサーサイト




<< macOSアプリの名前が日本語で表示されない  TopPage  年賀状の宛名印刷アプリ「CSVから宛名印刷」をリリース >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1388-f587e04f




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.