実現したいこと
タップしたら、その中の配列(プロパティ)を表示したいです
前提
FolderRowとして、カスタムViewセルをstructしています。
発生している問題・エラーメッセージ
Cannot find 'folderRowArray' in scope - Extraneous whitespace after '.' is not permitted --- Missing arguments for parameters 'folderRowArray', 'folderRowSystemNameText', 'folderRowName' in call
該当のソースコード
SwiftUI
1 2struct ContentView: View { 3 @Environment(\.managedObjectContext) private var viewContext 4 5 @FetchRequest( 6 sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], 7 animation: .default) 8 private var items: FetchedResults<Item> 9 10 private let list1 = [ 11 SampleStruct(sectionTitle: "A", listContent: ["elementA1", "elementA2", "elementA3"]), 12 SampleStruct(sectionTitle: "B", listContent: ["elementB1", "elementB2", "elementB3"]), 13 SampleStruct(sectionTitle: "C", listContent: ["elementC1", "elementC2", "elementC3"]), 14 ] 15 16 var body: some View { 17 NavigationView { 18 List { 19 ForEach(list1) { item in 20 Section(item.sectionTitle) { 21 ForEach(item.listContent, id: \.self) { item2 in 22 Text(item2)} 23 .toolbar { 24 ToolbarItem(placement: .navigationBarTrailing) { 25 EditButton() 26 } 27 } 28 } 29 } 30 } 31 .navigationTitle("A") 32 }}} 33 34struct FolderRow: View { 35 var folderRowArray: [String] 36 var systemNameText: String 37 var folderRowName: String 38 var body: some View { 39HStack{ 40Image(systemName: systemNameText) 41Text(folderRowName) 42Text("\(folderRowArray.count)") 43} 44 } 45} 46 47 struct SampleStruct : Identifiable { 48 let id = UUID() 49 let sectionTitle: String 50 let listContent: [String] 51 } 52 53 struct ContentView_Previews: PreviewProvider { 54 static var previews: some View { 55 ContentView() 56 } 57 } 58
試したこと
とてもややこしいのが、遷移したいのは、FolderRowの中のfolderRowArrayなので、folderRow.folderRowArrayとするのか、あるいはitemをからめて記述するのか、というところです。
(folderRowArrayもitemに保存するはずですので)
両方試しました。
補足情報(FW/ツールのバージョンなど)
Xcode14.1
追記
コメントありがとうございます。
修正できそうですか?
> 意としてるのは、iPhoneのメモの追加フォルダです
なるほど。
固定と言っていたと思うのですが、
フォルダ自体は増えたり減ったりしないということですかね。
(ユーザーがフォルダを追加したり、削除したりはできない?)
そうだとすると、
フォルダの表示の部分(ビュー・画面の構造体)は、
ForEachなどは使わずに、
直接Sectionを3つ("A","B","C")と続けて記述しても良いのかもしれませんね。
> あとから追加してるにもかかわらず、そのそれぞれをタップすると、そのそれぞれの配列に遷移します
ごめんなさい。
ここはまだちゃんと理解できないです・・
画面設計書とかワイヤーフレームとかイメージを共有できていれば、また違うのかもしれませんが、
ちょっと言葉だけでは伝えるのも、理解するのも、難しいところですね。
(システム開発{アプリ開発}の難しいところですね)
> プレビューコントローラーにもfolderRowへの言及の必要が書かれ、そんなこと通常であり得るの?という心情です。
構造体の場合はプロパティを定義すると
自動的にイニシャライザでそれを受け取るようになっているみたいですね。
(「Memberwise Initializers」というみたいです)
Memberwise Initializers for Structure Types
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization#Memberwise-Initializers-for-Structure-Types
ContentViewに`var folderRow: FolderRow`と記述してしまっていますので、
FolderRowの構造体を受け取るようなイニシャライザが自動的に実装されることになると思います。
---
ちょっとこの質問とは直接的には関係ないですが、
1つお聞きしておきたいことがあります。
フォルダごとにデータを管理すると思いますが、
このデータはどのように識別しますでしょうか?
ItemのEntityにいくつかAttributeを追加されていたようですが、
フォルダ名など追加する予定でしょうか?
*見当違いなことを聞いてしまっていたらすみません
コメントありがとうございます
ちょうど更新しようと思っていたところなのですが
考えている方法がデジタルだとしたら、それができずにアナログでやろうとしてむだにおなじstructがふえていきそうだったので、
そのことについてコメントしようとおもっていました
---
リレーションでは?と思い、調べていたのですが、
そうしなくても、いける気がしています
---
ItemのattributeはひとつのEntityにまとめて と思いましたが、ひとつのセルが持つBoolなどを第二のEntityに保存して、リレーションかな…?ともおもっています
(先述とことなっています)
---
自動でイニシャライザを記述ということは、やはりプレビュープロバイダーにもfolderRowのプロパティの記述が必須なのですね
---
固定の3つのうちのひとつ(のセクション)には、あとから追加することになります。
初期段階から、3つとも名前など全て固定です
クラッシュするコードだったので、ひとつ前のコードにしました
参照リンクもありがとうございます。
> むだにおなじstructがふえていきそうだったので、
正しく理解できていないかもしれませんが、
レイアウトが同じであれば、
ビュー(画面)のstructを1つ作って、
データだけを親から渡してあげれば良いのかなと思います。
---
> ItemのattributeはひとつのEntityにまとめて と思いましたが、ひとつのセルが持つBoolなどを第二のEntityに保存して、リレーションかな…?
承知しました。
引き続き検討してみてください。
CoreDataはあまり詳しくないのですが、
データベース設計としては、
同じまとまりなら一つのEntityで良いのではないかなと思います。
1:多の関係になるのでしたら、リレーションシップになる感じですかね。
(考え方は色々あると思いますので、話半分で聞いてOKです)
---
> 自動でイニシャライザを記述ということは、やはりプレビュープロバイダーにもfolderRowのプロパティの記述が必須なのですね
こちらは、解釈が逆になるかなと思います。
ContentViewに`var folderRow: FolderRow`と記述してしまうと、
自動的にfolderRowを引数に受け取るようになってしまうので、
ContentViewを呼び出す側で`ContentView(folderRow: ~)`と記述しないといけないことになってしまいます。
ですので、ContentViewには`var folderRow: FolderRow`を記述しない方針で実装する必要があると思います。
--
> 固定の3つのうちのひとつ(のセクション)には、あとから追加することになります。
セクションの一つもユーザーによって追加する感じなのですね。
(ちょっと余計イメージがわからなくなってしまいましたが・・)
---
画面イメージもありがとうございます。
Editボタンがたくさんになってしまいましたね・・
---
この質問のタイトル「カスタムViewの表示」が目的ですよね。
基本的には前の質問で使っていたのと同じようにすればOKなのですけどね。
(AnotherAnotherViewとかのことです)
現在の質問欄のコードにある`Text(item2)`の部分を、
FolderRowを呼び出すような感じになります。
3つの固定セルは、それぞれ用意して、if で表示するEntityのStringを3つにすれば、解決できるのでは?と思っています
親からデータだけ
これが理想なのですが、タップ判定ってできるのでしょうか?
このセルをタップしたら、このEntityのtext○を表示
のように
(text1, text2, text3でattributeを設定します)
---
イニシャライザの記述はあまり好ましくないのでfolderRowは ContentViewにはのせません
すみません、
iPhoneのフォルダ追加のようなものだとおもってください
EditButton()はバグですか?
---
できるだけ前回のものを使いたいとおもっています。
あと一点
item2がどこに宣言されているのか、わかりません
リレーションかな、とおもっている理由は、ひとつのセルが待つ複数のデータ(String、Bool)をデータごと に保存する必要があるのかな?とおもっているためです
> これが理想なのですが、タップ判定ってできるのでしょうか? このセルをタップしたら、このEntityのtext○を表示 のように (text1, text2, text3でattributeを設定します)
タップはできると思います。
でも、仕様がうまく把握できませんでした・・
フォルダA、フォルダB、フォルダCに1つのエンティティがそれぞれ表示されることもあるのでしょうか?
(データの関係がうまく把握できていないのかもしれません)
(フォルダAはtext1?、フォルダBはtext2?、フォルダCはtext3?のような?)
> EditButton()はバグですか?
ForEachの中にtoolbarを記述しているためですね。
3つ目の回答のコードを参考に、
どこの位置にtoolbarを記述しているか見てみてください。
> item2がどこに宣言されているのか、わかりません
item2はクロージャの中で使える引数なのですが、
ForEachに渡しているitem.listContent(Stringの配列)につきまして、
ForEachがStringの配列を1つずつに分けて
クロージャの中身({}のことです)を実行してくれます。
この時の要素1つをitem2の変数に設定して実行しれくれる形です。
(宣言がどこかというと、「in」の直前ですね)
Closure Expression Syntax
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/#Closure-Expression-Syntax
> リレーションかな、とおもっている理由は、ひとつのセルが待つ複数のデータ(String、Bool)をデータごと に保存する必要があるのかな?
そうなのですね。
では、1:多の関係っぽいですね。
リレーションシップで良いのかもしれませんね。
フォルダAはtext1?、フォルダBはtext2?、フォルダCはtext3?のような?
そうです
ほかに方法があれば、いいですが
ここでのリレーションの話は申しわけないので、やめにします
ありがとうございます
---
イニシャライザの記述が好ましくない は語弊がありますね
プレビュープロバイダーへのその他のViewのイニシャライザの記述は
です
カスタムViewの表示はText(text)の部分をFolderRowのようなstructとそのプロパティ でいいのですね。
EditButton()のForEachの記述もありがとうございます
回答3件
あなたの回答
tips
プレビュー