92235


swift ui で

他画面から他画面にappendしようとすると

No exact matches in call to instance method 'append'

と

Value of type 'TextEditor' has no member 'text'

というアラートが出ます。

append は使えないのでしょうか？

また、TextEditorはtextを持っていないのでしょうか。

ContentView().array.append(textEditor.text)

としています。


CC BY-SA 4.0
2022-11-14T06:10:08.287
92217
2022-11-15T07:42:44.993
39481
question
swiftui
No exact matches in call to instance method 'append'


> No exact matches in call to instance method 'append'

確証はありませんが、おそらく`ContentView().array.append(textEditor.text)`の`textEditor.text`を、`"Sample"`などと、`String`型のリテラルなどに置き換えると、このメッセージは消えるんじゃないでしょうか？`textEditor.text`の型が`String`型である保証がないので、型が一致しないというエラーにせざるをえないというニュアンスに見えます。もっとも、エラーが消えなくても問題の本質とは関係ありませんが。

> また、TextEditorはtextを持っていないのでしょうか。

はい、ありません。

Apple Developer Documentation [Structure
TextEditor](https://developer.apple.com/documentation/swiftui/texteditor)

このページと、このページ内のリンク [View
Implementations](https://developer.apple.com/documentation/swiftui/texteditor/view-
implementations)
にあるプロパティが、`TextEditor`が持つプロパティのすべてです。この二か所にないプロパティは、他のどこにもありません。  
このApple Developer
Documentationは、Appleのサイトだけでなく、Xcodeにも付属しています。何か疑問が生じたら、最初にApple Developer
Documentationを調べるという習慣を身につけておくと、作業や勉強が、格段にはかどると思います。

**●ではどうやって、`TextEditor`に入力した文字列を、プログラムが受け取ればいいのか？**  
いちばん肝心なことは、その発想はSwiftUIの基本概念となじまないという点です。プログラムの根幹の部分に、GUI（Graphic User
Interface）の部品が関与する構造は避けよう。GUIの構成にすこしでも変更を加えたら、プログラム全体が動かなくなるような構造にしてはいけない。それがSwiftUIの基本的な考え方です。

`TextEditor`を使った、かんたんなプログラムを書いてみましょう。

[code]

    import SwiftUI
    
    struct ContentView: View {
        
        @State var myText = ""
        
        var body: some View {
            VStack {
                TextEditor(text: $myText)
                    .padding()
                Text(myText)
            }
        }
    }
    
[/code]

`TextEditor`のイニシアライザには、`@State`や`@Binding`をつけた`String`型のプロパティを、引数に取ることが、必須です。その引数なしにインスタンスを作ることはできません。上のコードでは、プロパティ`myText`が、`$`付きで引数に代入されています。  
こうすることで、`TextEditor`にユーザが行なった入力が、プロパティ`myText`の値を、リアルタイムで変更していきます。それは、`myText`を表示する`Text`が、タイピングのたびに変化することで、確認できます。  
以上から、`TextEditor`に入力した文字列の値は、`TextEditor`のイニシアライザの引数に指定したプロパティとリアルタイムで同一なのだから、そのプロパティにアクセスすることで、得ることができる。そういうことがわかると思います。

さらに、`ContentView().array`という、プロパティ`array`に対するアクセスも、SwiftUIの流儀に反することがわかります。`ContentView`もGUIのパーツのひとつでしかありません。  
（さらに、さらに付け加えて、`ContentView()`って、既存の`ContentView`とは別の、新規のインスタンスを作って、いったい何をしたいわけ？っていう問題もはらんでいるんですけどね）

最後に、モーダル画面に、任意の文字列を入力すると、元画面のリストに、入力した文字列が追加されて表示されるという、サンプルコードを添付しておきます。  
このサンプルコードでは、意図して、`TextEditor`ではなく、`TextField`を使用しています。それは、SwiftUIでは、GUIの変更が、プログラムの根幹部分に影響を与えないようにしようという考え方を、実際に体験してもらうためです。`TextField`を`TextEditor`に置き換えるということを、チュートリアルと思って、やってみると、面白いと思います。

[code]

    import SwiftUI
    
    struct ContentView: View {
        
        @State var myArray = ["Sunday", "Monday", "Tuesday"]
        @State var showModal = false
        
        var body: some View {
            VStack {
                List(myArray, id: \.self) { weekName in
                    Text(weekName)
                }
                    .padding()
                Button("Add an Item") {
                    self.showModal.toggle()
                }.sheet(isPresented: $showModal) {
                    ModalView(isActive: $showModal, myArray: $myArray)
                }
            }
        }
    }
    
    struct ModalView: View {
        @Binding var isActive: Bool
        @Binding var myArray: [String]
        
        @State private var newName = ""
        
        var body: some View {
            VStack {
                Text("Input a new name.")
                    .padding()
                TextField("New Name", text: $newName)
                Button("Dismiss") {
                    myArray.append(newName)
                    isActive.toggle()
                }
            }
        }
    }
    
    @available(iOS 15.0, *)
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
                .previewInterfaceOrientation(.portrait)
        }
    }
    
[/code]


CC BY-SA 4.0
2022-11-15T03:22:56.917
92235
2022-11-15T07:42:44.993
2022-11-15T07:42:44.993
18540
18540
92217
answer