質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

4回答

670閲覧

ToolbarItemでのEntityの参照

ruru313245

総合スコア8

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2023/04/01 08:14

編集2023/04/02 07:59

実現したいこと

ItemのattributeをToolbarItem遷移時につぎのViewにわたしたい

前提

NavigationLinkでは同じようなViewに遷移できるのに対し、ToolbarItemでは遷移できません。(ToolbarItemの遷移では、Entityのtext(String)をTextEditorに代入していないだけです。)

発生している問題・エラーメッセージ

Cannot convert value of type 'Item.Type' to expected argument type 'Item'

該当のソースコード

SwiftUI

1 2struct ContentView: View { 3 @Environment(\.managedObjectContext) private var viewContext 4 5 @FetchRequest( 6 sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: false)], 7 animation: .default) 8 private var items: FetchedResults<Item> 9 10 var body: some View { 11 NavigationView { 12 List { 13 ForEach(items) { item in 14 NavigationLink { 15 AnotherView(item: item) 16 } label: { 17 Text(item.text ?? "") 18 } 19 } 20 .onDelete(perform: deleteItems) 21 } 22 .toolbar { 23#if os(iOS) 24 ToolbarItem(placement: .navigationBarTrailing) { 25 EditButton() 26 } 27#endif 28 ToolbarItem { 29 NavigationLink { 30AnotherAnotherView(item: Item) 31} label: { 32Image(systemName: "gear") 33} 34 } 35 } 36 Text("Select an item") 37 } 38 } 39 40 private func addItem() { 41 withAnimation { 42 let newItem = Item(context: viewContext) 43 newItem.timestamp = Date() 44 45 46 do { 47 try viewContext.save() 48 } catch { 49 // Replace this implementation with code to handle the error appropriately. 50 // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 51 let nsError = error as NSError 52 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 53 } 54 } 55 } 56 57 private func deleteItems(offsets: IndexSet) { 58 withAnimation { 59 offsets.map { items[$0] }.forEach(viewContext.delete) 60 61 do { 62 try viewContext.save() 63 } catch { 64 let nsError = error as NSError 65 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 66 } 67 } 68 } 69} 70 71--- 72 73struct AnotherAnotherView: View { 74 75@Environment(\.managedObjectContext) private var viewContext 76@State var textEditorText = "" 77var item: Item 78このコードをクリップボードにコピー 79var body: some View { 80TextEditor(text: $textEditorText).frame(width: .infinity, height: .infinity) 81 82.toolbar { ToolbarItem(placement: .navigationBarLeading){ Button(action: {additem()}) {Image(systemName: "heart")}} } 83} 84 85func additem () { 86withAnimation { 87item.text = textEditorText 88 89 do { 90 try viewContext.save() 91 } catch { 92 let nsError = error as NSError 93 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 94 } 95 } 96}} 97

試したこと

AnotherAnotherViewのitemを、item.text、Item.textにもしました。

補足情報(FW/ツールのバージョンなど)

Xcode14.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/04/01 08:54

私がコメントしてしまってすみません・・ 好きでしていることなので、気にしないでくださいね。 (もし私と関わりたくないということでしたらはっきりそう言ってもらえると助かります{ちゃんと言ってもらえないと理解できない人間なので・・}) > NavigationLinkでは同じようなViewに遷移できるのに対し、ToolbarItemでは遷移できません。 今回の質問内容だけを見ると、 NavigationLinkが該当のソースコードにないので、 問題を理解することが難しいかもしれませんね。 AnotherAnotherViewの全体のコードは記載する必要がないかもしれません。 逆に、ToolbarItemを記述しているコードの全体を記述した方が回答しやすいかなと思いました。 --- 前の質問からの流れでの確認になってしまいますが、 Listの方は編集の意味合いでAnotherAnotherViewに内容を表示するのですよね? ToolbarItemの方はどういった意味合いでAnotherAnotherViewに内容を表示したいのでしょうか?
ruru313245

2023/04/01 10:28

ご回答ありがとうございます 誤認のないよう言っておきますが、関わりたくないわけではありませんよ あまりわたしと関わってその後あなたの可動域に支障をきたしても、とおもったので --- 念のため、言っておきますが わたしもすぐコメントできるときとできないときがあるので、念頭においておいてください ToolbarItemでの遷移は、AnotherViewとは一点だけ異なり、AnotherAnotherViewに用意したTextEditorに入力したStringを、Entityのtextに保存したい、と思っています。
ruru313245

2023/04/01 10:31

コードの修正もしました
退会済みユーザー

退会済みユーザー

2023/04/01 11:50

コメントありがとうございます。 > わたしもすぐコメントできるときとできないときがあるので、念頭においておいてください それで大丈夫です!
ruru313245

2023/04/01 20:34

わかりました ありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/02 05:14

Item.attribute must have a defined type のエラーは、 ItemというEntityのattribute属性(Attribute)の型が設定されていない(=Undefined)から なのではないかと思います。 でも、画像を見たところUndefinedのものはなさそうですよね。 [Product]-[Clean Build Folder]でクリーンしてみたらどうなります? あるいはXcodeを再起動するとか? エラーメッセージの最後の「[2]」というのも気になりますね。 手元で再現確認してみても、「[2]」っていうのは表示されないのですけどね。 CoreDataのファイルは1つだけですよね?
ruru313245

2023/04/02 07:31

画像追加を確認していただいたのですね attributeの話が肥大すると思い、 削除してしまいました。
退会済みユーザー

退会済みユーザー

2023/04/02 07:35

> attributeの話が肥大すると思い、 確かに、記載するとしたら別の質問にした方が良いかもしれませんね。
guest

回答4

0

コメントありがとうございます。

別の回答として書き込みしますね。

以下のコードで、一点だけ、遷移の際のEntityについての言及でエラーが出ます。
ContentViewの NavigationLink(destination: ArrayView(item: Item), label: { の行のところで 「Cannot convert value of type 'Item.Type' to expected argument type 'Item'」 のビルドエラーが発生しているのを解消したい、ということでいいです

このエラーは、Itemエンティティの「型」を渡しているので発生していると思います。
ArrayViewの引数で要求しているのは、Itemエンティティの「インスタンス」になると思います。
でも、ArrayViewの中ではitemプロパティを使っていないみたいでしたので、この引数は使わない(削除する)方針で修正してみました。

swift

1struct ContentView: View { 2// viewContextとitemsはContentViewの中で使用していないため削除しても良いかもしれません。 3// @Environment(\.managedObjectContext) private var viewContext 4// @FetchRequest( 5// sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], 6// animation: .default) 7// private var items: FetchedResults<Item> 8 var body: some View { 9 NavigationView { 10 List { 11 Section(header: Text("Section1")) { 12 // ArrayViewはitemプロパティが不要そうに見えましたので、引数に指定しないようにしました。 13 NavigationLink(destination: ArrayView(), label: { 14 ListRow(a: "テキスト", b: "pin", c: [""]) 15 }) 16 } 17 } 18 .toolbar { 19// ...省略...

swift

1struct ArrayView: View { 2 @Environment(\.managedObjectContext) private var viewContext 3 @FetchRequest( 4 sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: false)], 5 animation: .default) 6 private var items: FetchedResults<Item> 7// ArrayViewはitemのプロパティが不要そうに見えましたので、コメントアウトしています。 8// そうすると、ContentViewからArrayViewを呼び出す際に引数が不要になります。 9// var item: Item 10 var body: some View { 11// ...省略...

でも、この実装で希望する動作になるのか、わからないところもあります。
データの持ち方をどうしたら良いのか、ちゃんとお話ししたいのですけどね・・
QAサイトの文章だけだと、どうしても、限界がありますよね・・

投稿2023/04/19 11:41

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruru313245

2023/04/19 17:06

ご回答ありがとうございます 定式的な図で説明したいということでしょうか 頭のいいひとの考えかたですね わたしがフリーハンドで描いてもいいのですが よけいわからなくなっても困るので 簡易的な テキストでお伝えしたいとおもいます (つかうView) ContentView → → SettimgView ArrayView → PostView EditView (Entity's attribute) [Item] text1(String) text2(String) text3(String) Bool1(Bool) Bool2(Bool) ContentViewのListにSection1、Section2、Section3があり、それぞれをタップするとArrayViewに遷移して、それぞれの場合text1、text2、text3をArrayViewに表示する ArrayViewに表示されたものはタップするとEditViewに遷移して、編集、Bool1、Bool2の Bool値によってtextのいずれかに振り分けられる また、その際、textのひとつひとつ(全体のうちのひとつひとつです)にBool1、Bool2の値を保存して永続化する というものです。 おおよそですが、伝わりますでしょうか (※ ArrayViewの表示の際にArrayViewに空の配列を用意して、そこにtext(1,2,3)を入れたいと思っているのですが、item(Itemのインスタンス)をitem.text○として、代入できないことが問題です。) → (わざわざ、代入しなくても、○○のときはtext○ というようにifまたはswitchをつかえばいいでしょうか?)
退会済みユーザー

退会済みユーザー

2023/04/20 00:12

コメントありがとうございます。 > 定式的な図で説明したいということでしょうか 確かに、図などを使う方がわかりやすいですよね。 > 頭のいいひとの考えかたですね ありがとうございます。 でも私は頭は良くないです・・伝えるのは苦手ですし・・ でも文章の方が考える時間がある分、話すよりはマシかもしれないですが・・ QAサイトだと往復に時間がかかってしまいますので、煩わしい感じがあります。 > Bool1、Bool2の Bool値によってtextのいずれかに振り分けられる textは3つあるのに、Boolは2つなのですね。 余ったtext一つ分への振り分けはどうなるのか、気になりました。 > また、その際、textのひとつひとつ(全体のうちのひとつひとつです)にBool1、Bool2の値を保存して永続化する text一つに対してBoolが2つというような解釈をしたのですが、 エンティティはItem以外にあるということでしょうか? ・「Item.text1」に対して「別のエンティティ.Bool1」と「別のエンティティ.Bool2」 ・「Item.text2」に対して「別のエンティティ.Bool1」と「別のエンティティ.Bool2」 ・「Item.text3」に対して「別のエンティティ.Bool1」と「別のエンティティ.Bool2」 --- > (※ ArrayViewの表示の際にArrayViewに空の配列を用意して、そこにtext(1,2,3)を入れたいと思っているのですが、item(Itemのインスタンス)をitem.text○として、代入できないことが問題です。) > (わざわざ、代入しなくても、○○のときはtext○ というようにifまたはswitchをつかえばいいでしょうか?) いつもしてくれる返信のコメントがなかったので気になっていたのですが、 次の回答を読んでもらえなかったみたいですね。 https://teratail.com/questions/9kaidw8h93ulxo#reply-4lxkbgvifgt3g3 配列は不要だと思います。 配列をForEachでループして表示するのではなく、 固定でtext1,text2,text3を順番に記述した方が良いケースだと思います。 (記述を短くするために汎用的なループで記述することもできると思いますが、今はそういうことをしない方がコードが読みやすいと思います) リンク先の回答にあるコードのContentViewが 今回のお話しのArrayViewに相当していると思います。
ruru313245

2023/04/20 00:43

おはようございます text○のひとつのテキストに対し、(メモ全体のうちの1つです)Bool値が2つ です。 iPhoneのピン留めのように、trueにしたら○○という感じです Entityは1つです。 新しくご回答ありがとうございます 読んでいませんでした。 keyPathですね ありがとうございます わたしもみてみます 配列は使用しないほうがいいのですね きのうもBinary Dataのものをみていました 新しくご回答していただいたkeyPathのコードをみてみます ありがとうございます --- わたしは 直接はなすこともできるのですが、 経験から 文章だと意としない方向への進行を 比較的防げる気がします もちろん、一長一短で テンポ があるので、 はなす方が伝わるときもありますが
ruru313245

2023/04/20 00:47

QAサイト以外だと、メールとかということですか?
退会済みユーザー

退会済みユーザー

2023/04/23 01:47 編集

> text○のひとつのテキストに対し、(メモ全体のうちの1つです)Bool値が2つ > Entityは1つです。 これを読む限り、やっぱりエンティティ1つだとダメそうに感じますね・・ (エンティティ1つがダメというか、ItemエンティティにBoolが2つだけというのがダメそう?) (私が理解できていないだけかな・・) > 配列は使用しないほうがいいのですね 配列にした方が良いところは配列で良いと思います。 ですが、今回のケースはtext1,text2,text3で固定ですので、 無理して配列にしない方がわかりやすいと思いました。 > 比較的防げる気がします > はなす方が伝わるときもありますが 色々考えていらっしゃるのですね。 納得です。
ruru313245

2023/04/20 05:11

> text○のひとつのテキストに対し、(メモ全体のうちの1つです)Bool値が2つ > Entityは1つです。 これを読む限り、やっぱりエンティティ1つだとダメそうに感じますね・・ (エンティティ1つがダメというか、ItemエンティティにBoolが2つだけというのがダメそう?) (私が理解できていないだけかな・・) すみません リレーションなので、2つでした --- メールはコードがハイライトされるのを見た気がします ここにアドレスを載せてもいいんですかね? --- GitHubは使い方がよくわからず、 リポジトリ が預けるところ ということまでは、わかるのですが、 タイミングをみて、ページを確認しています (かなり非効率ですね スクロール) ご返信ありがとうございます
退会済みユーザー

退会済みユーザー

2023/04/23 01:47 編集

コメントありがとうございます。 > リレーションなので、2つでした OKです! > メールはコードがハイライトされるのを見た気がします HTML形式ですかね。 やったことないですが、簡単に作れるのかな? > GitHubは使い方がよくわからず、 そうなのですね。 コードはバージョン管理しておいた方が良いですので、 ちょっと覚えるのは大変と思いますが、 取り入れてみるのもいいかなと思いました。
cocoa65

2023/04/20 09:21 編集

お世話になっています ArrayViewのitem: Item を削除したらtext1への遷移、編集まではできました あとは あと2つ同じようなものを用意して それぞれの表示、編集と それぞれの単位text○に EditViewでのBoolの値を保存する ことができれば とおもいます いまみました
退会済みユーザー

退会済みユーザー

2023/04/23 01:47 編集

コメントありがとうございます。 ちょっと今日は夕方から外出してしまって、コメントできるかわからないですが、またご連絡しますね。
guest

0

コメントありがとうございます。

コメントの流れが分断されてしまいますが、
別の回答にした方が良いと思いましたので、
新しい回答にしますね。

遷移元はtext1,2,3をEntityのattributeに持っており(全部で共通かもしれませんが)、ひとつの遷移先にいきます
ですので、そのひとつの遷移先のListのlabel: でif 文またはswitchかなと考えていました。

そういうことですね。

1つの子のビューでtext1,text2,text3のアトリビュートを扱えるようなコードを考えてみました。

text1,text2,text3を識別するために、
ifやswitchを使うのではなく、
KeyPathを使ってみました。
*最近KeyPathの使い方を覚えましたので、最適な形にできているかどうか、もっと最適な記述の仕方はできるのかもしれません
*KeyPathを使わなくて済むようなデータの持ち方にした方が、どちらかというと良いのかもしれません

KeyPathについての公式のドキュメントのリンクもつけておきますので、
余裕があったら見てみてください。
Expressions | Documentation

swift

1// ContentView(bodyプロパティだけ) 2 var body: some View { 3 NavigationView { 4 List { 5 // Listの中はForEachを使わずに(配列で扱わずに)直接NavigationLinkを順番に記述します。 6 // (テストのためitemsの最初の要素を表示しています) 7 if let item = items.first { 8 NavigationLink { 9 // text1を表示・編集します。 10 // `\Item.text1`のKeyPathを渡すことでSubViewの中ではtext1を扱えば良いと判断できるようにしています。 11 SubView(item: item, keyPathItemText: \Item.text1) 12 } label: { 13 Text(item.text1?.isEmpty ?? true ? "text1の初期値です。" : item.text1!) 14 .lineLimit(1) 15 } 16 NavigationLink { 17 // text2を表示・編集します。 18 SubView(item: item, keyPathItemText: \Item.text2) 19 } label: { 20 Text(item.text2?.isEmpty ?? true ? "text2の初期値です。" : item.text2!) 21 .lineLimit(1) 22 } 23 NavigationLink { 24 // text3を表示・編集します。 25 SubView(item: item, keyPathItemText: \Item.text3) 26 } label: { 27 Text(item.text3?.isEmpty ?? true ? "text3の初期値です。" : item.text3!) 28 .lineLimit(1) 29 } 30 } 31 } 32// ...ContentViewは以下省略... 33 34// SubView 35struct SubView: View { 36 @Environment(\.dismiss) var dismiss 37 @Environment(\.managedObjectContext) private var viewContext 38 @State var text: String 39 // Itemエンティティです。 40 let item: Item 41 // text1,text2,text3を識別するためのプロパティです。 42 let keyPathItemText: ReferenceWritableKeyPath<Item, String?> 43 var body: some View { 44 TextEditor(text: $text) 45 .navigationBarBackButtonHidden(true) 46 .toolbar { 47 ToolbarItem(placement: .navigationBarLeading) { 48 Button("Back", action: action) 49 } 50 } 51 } 52 init(item: Item, keyPathItemText: ReferenceWritableKeyPath<Item, String?>) { 53 // text1,text2,text3のいずれかの値をtextプロパティに保持します。 54 _text = State(initialValue: item[keyPath: keyPathItemText] ?? "") 55 self.item = item 56 self.keyPathItemText = keyPathItemText 57 } 58 // Backボタンをタップしたら保存するためのメソッドです。 59 func action() { 60 // Itemエンティティのtext1,text2,text3のいずれかにtextプロパティの内容を設定します。 61 item[keyPath: keyPathItemText] = text 62 do { 63 try viewContext.save() 64 } catch { 65 let nsError = error as NSError 66 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 67 } 68 dismiss() 69 } 70}

投稿2023/04/16 03:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruru313245

2023/04/20 09:31

ご回答ありがとうございます。
ruru313245

2023/04/20 09:38

わたしの思いちがいだったら大変申し訳ないのですが、 わたしもUnityをやっていたことがあり、 ひとりでfps切替え式のRPGをつくったことがあります。 コリジョンとか当たり判定の設定ですよね フィールド、キャラクター、その他…のGUIをつくるのがむりで、中断しましたが、
退会済みユーザー

退会済みユーザー

2023/04/23 01:48 編集

Unityはやったことないです… 難しそうですけど、 面白そうてすよね。
guest

0

ベストアンサー

AnotherAnotherViewの中で、新しく生成することができるのですか?

viewContextがあれば新しく生成することができますよ。
この辺りは、ちゃんと動かしながら進めていくと、すぐに実感できるかもしれませんね。

修正したコードですが、ちょっと最初の回答と位置付けが異なるため、別の回答にさせていただきました。

swift

1// --- ContentViewの一部です。 2 ToolbarItem { 3 NavigationLink { 4 AnotherAnotherView() 5 } label: { 6 Image(systemName: "gear") 7 } 8 } 9 10struct AnotherAnotherView: View { 11 @Environment(\.managedObjectContext) private var viewContext 12 @State var textEditorText = "" 13 // --- itemプロパティは削除しました。 14 var body: some View { 15 TextEditor(text: $textEditorText) 16 .frame(maxWidth: .infinity, maxHeight: .infinity) 17 .toolbar { 18 ToolbarItem(placement: .navigationBarLeading) { 19 Button(action: additem) { 20 Image(systemName: "heart") 21 } 22 } 23 } 24 } 25 // --- 質問欄のコードを元にしているため、heartボタンをタップした時にしか保存しません。 26 func additem() { 27 withAnimation { 28 // --- 新しいItemのインスタンスを生成します。 29 // --- 必要なプロパティ(EntityのAttribute)を設定してください。 30 let newItem = Item(context: viewContext) 31 newItem.timestamp = Date() 32 newItem.text = textEditorText 33 do { 34 try viewContext.save() 35 } catch { 36 let nsError = error as NSError 37 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 38 } 39 } 40 } 41}

投稿2023/04/02 08:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruru313245

2023/04/02 08:39

ありがとうございます。 たまに起こるのですが、 わたしの{}の組み方がわるいのかもしれませんが、 Trailing closure passed to parameter of type 'Visibility' that does not accept a closure とでます Foldで確認しましたが、List、tmolbarともに正常だとおもいます
退会済みユーザー

退会済みユーザー

2023/04/02 08:52

Foldって知らないのですが、何でしょうか? > Trailing closure passed to parameter of type 'Visibility' that does not accept a closure ちょっとこのエラーはあまり見たことがないので、 わからないのですが、 気になるのは、 コードの段落の書き方についてです。 ちゃんと「{」の後で改行して、 それ以降のコードは段落をつける。 閉じるかっこ「}」のところで段落を戻す。 というのを意識した方が良いのかなと感じました。 全部を1行で書いてしまうこともできるのですが、 そうすると、1行の中のどこでエラーになっているのか、 エラーメッセージから把握するのが難しくなってしまうと思いました。
ruru313245

2023/04/02 09:08

慣れている方はifを(x ? true : false)のような書き方をするというのはわかります。 Foldは{}の所で⌘を押しながら、畳むやつです。 段落を確認してみます
ruru313245

2023/04/02 09:11

できました 大変すみません
ruru313245

2023/04/02 09:13

ありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/02 09:24

> Foldは{}の所で⌘を押しながら、畳むやつです。 初めて知りました。 勉強になります。 終わりの「`}`」のところでコマンドキーを押しながらクリックするとFoldで折りたたむことができるのですね。 > 慣れている方はifを(x ? true : false)のような書き方をするというのはわかります。 確かに、そういう書き方をすることもありますよね。 でも、それがわかりやすいと思う時に記述すれば良いと思います。 私も、ifの方がわかりやすいのであればifで良いと思います。 https://docs.swift.org/swift-book/documentation/the-swift-programming-language/basicoperators/#Terminology 「Trailing Closures」というのは、 乱暴な説明かもしれませんが、 引数の最後がクロージャの場合は「()」を省略して、 「ToolbarItem { ... }」のようにすぐにクロージャ(`{}`の中身のことです)を記述できることを言います。 https://docs.swift.org/swift-book/documentation/the-swift-programming-language/closures/#Trailing-Closures > Trailing closure passed to parameter of type 'Visibility' that does not accept a closure のエラーは、 「Visibility」型を要求されているところに、 クロージャ(`{ ... }`のことです)を記述してしまっているから エラーになっているのかなと思いました。 (具体的なコードを見てみないと、はっきりしたことは言えないのですが、書いてみました。)
ruru313245

2023/04/02 09:31

大変ありがとうございます
ruru313245

2023/04/02 09:32

参照のリンクもありがとうございます いままでの疑問の解消につながりました
ruru313245

2023/04/02 09:34

ここに書くかまよいましたが、 まだ解消するべき課題があるので、投稿させていただきます
ruru313245

2023/04/14 13:58

こんばんは 以前、Entityに3種類のtext(text1, text2, text3)があり、そのそれぞれをひとつのViewでそれぞれに保存できる ようにするにはif文というおはなしをしましたが、 その ひとつのViewの持つEntityのそれぞれのtext(text1, text2, text3)を入れるarrayをarrayViewArrayとすると、 書き出しは if arrayViewArray == item.text1 { item.text1 = …} でしょうか それともswitch arrayViewArray{ case item.text1: case item.text2: case item.text3: … } とするのでしょうか。 回答できる場合は、簡易的でいいので、お願いします。
退会済みユーザー

退会済みユーザー

2023/04/14 14:44

こんばんは。 まだ開発を続けていたようで良かったです。 ちょっと別の質問をあげてもらった方が良い気もしますが、 コメントしてみますね。 ifとswitchの2択での質問なのですが、 これだけを見ると、 どちらでも変わらないように思いました。 私が問題を理解できていないだけかもしれません・・ 一つのEntityに持つ3種類のtext(text1,text2,text3)を 一つの子のViewで表示・編集できるように扱いたいということですよね。 (親のViewから子のView(対象のView)に渡したいということですよね) arrayViewArrayがどのように保持されているのか、 ちょっと把握できていないのですが、 配列にする必要はないように思いました。 text1を表示したいところで`SubView(text: item.text1)`のように記述して、 text2を表示したいところで`SubView(text: item.text2)`のように記述して、 text3を表示したいところで`SubView(text: item.text3)`のように記述して、 という感じかなと思いました。 引数がtextだけだと、 text1,text2,text3のうちどれが渡ってきたのか判断できないため、 これらを識別できるような引数も必要かもしれません。 期待するコメントをできている気がしませんので・・ またコメントか、別の質問か、もらえると助かります。
ruru313245

2023/04/15 10:56 編集

すみません こちらのご返信をみていませんでした、、 と、思いましたが 昨日ですね 通知にあがっていませんでした。 わかりやすいご返信をありがとうございます。 遷移元はtext1,2,3をEntityのattributeに持っており(全部で共通かもしれませんが)、ひとつの遷移先にいきます ですので、そのひとつの遷移先のListのlabel: でif 文またはswitchかなと考えていました。 Swiftは型が明瞭でいいのですが、名前が長いのと細かくわかれているので、CoreDataまで用いるとなんだかわからなくなりそうで、たいへんです。 いつもありがとうございます。
退会済みユーザー

退会済みユーザー

2023/04/16 03:20

> 通知にあがっていませんでした。 回答者が回答に対するコメントを入力しても通知は届かないみたいですね。 多分このコメントも通知が届かないと思います。 回答に対するコミュニケーションを取ろうとすると、ちょっと不便ですよね。
guest

0

画像を貼り付けたかったので、
回答に書き込みしてしまいますね。

添付した画像は手元で少しコードを修正してしまっていますが、
Listのitemは各行ごとにどのitemか特定できるようになっていると思います。

でも、ToolbarItemのitemはどの行のitemをAnotherAnotherViewに表示したいのかわからないと思います。
(Listに複数のitemが表示されている場合など)
この部分につきまして、画面のUIなどを踏まえた設計として、どのようにしたいのか、明確にした方が良いのかなと思いました。

イメージ説明

追記

常にitemsの1つ目をAnotherAnotherViewに表示するような感じで修正してみました。

swift

1// 省略 2 .toolbar { 3#if os(iOS) 4 ToolbarItem(placement: .navigationBarTrailing) { 5 EditButton() 6 } 7#endif 8 // --- ここでは常にitemsの1つ目の要素を参照します。 9 if let item1 = items.first { 10 ToolbarItem { 11 NavigationLink { 12 AnotherAnotherView(item: item1) 13 } label: { 14 Text(item1.text ?? "") 15 } 16 } 17 } 18 } 19 Text("Select an item") 20// 省略

投稿2023/04/01 11:57

編集2023/04/01 23:39
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruru313245

2023/04/01 20:54 編集

ご回答ありがとうございます。 ToolbarItemのitemは、どのitemかわからない いわれてみれば、そうかもしれません わたしの中では、Entity(ここではItem)のインスタンスがitemsで、その各々がitemだと思っています。 ですので、itemsとitem: Itemはどのような違いが? という疑問があります。 ToolbarItemで遷移する際、AnotherAnotherViewの TextEditorには、何も入れません。 そのTextEditorで入力した文字(textEditorText)をItemのtextに保存したい だけです。
退会済みユーザー

退会済みユーザー

2023/04/01 23:38

コメントありがとうございます。 うまく説明できずにすみません。 > いわれてみれば、そうかもしれません その感覚でOKと思います。 それを整理すると良いかなと思います。 > わたしの中では、Entity(ここではItem)のインスタンスがitemsで、その各々がitemだと思っています。 こちらも大まかにはOKと思います。 Entity(Item)のインスタンスの”集まり”がitemsで、 その要素1つ1つがitemですね。 > ですので、itemsとitem: Itemはどのような違いが? `var items: FetchedResults<Item>`(itemの集まり) と `var item: Item`(itemインスタンス1つ) は 別ですね。 `ForEach(items) { item in`の`item`(itemインスタンス1つ) と `var item: Item`(itemインスタンス1つ) は どちらもitemインスタンス1つですね。 まずエラーを解消するのを優先してみて、 どういう画面の動きになるのか見た方が良いのかなと思いました。 常にitemsの1つ目をAnotherAnotherViewに表示するような感じで修正してみますね。 *画面の動きとしてこれでは不都合があると思いますので、  改めてどういう動きにするか設計してみてください。
ruru313245

2023/04/02 03:30

ご回答ありがとうございます。 firstをつかえばいいのですね そうすることで、Entityのインスタンスの最初の1つが表示されるのですね item.textとしていないから、Listの文字はTextEditorには表示されないのですね。
ruru313245

2023/04/02 05:08 編集

ありがとうございます 遷移して、保存することができました。 ひとつ、firstに保存しているからか、いちばん上に保存して、またAnotherAnotherViewに遷移して、保存すると、セルが増えません。 --- itemにはattributeが全て入っているという認識でいいでしょうか? わかりやすくitem1にしていただき、ありがとうございます。
ruru313245

2023/04/02 05:38

わかりやすく設計をお伝えすると、 A, B, C(わかりやすくA, B, C)のヘッダーとセクションのListがあり、 それぞれをタップすると、 それぞれのList(いままでのContentViewだとおもってください) に遷移して、 あとは(いままでのAnotherViewに)ToolbarItemに遷移して、ContentViewの Listに追加していく というかんじです さいしょのA, B, Cのリストは固定です そのため、A, B, CのListのセルは自作のセルに とおもっていますが、 それもまたインスタンスの面でエラーが出る というかんじです
退会済みユーザー

退会済みユーザー

2023/04/02 05:47

コメントありがとうございます。 > ひとつ、firstに保存しているからか、いちばん上に保存して、またAnotherAnotherViewに遷移して、保存すると、セルが増えません。 続けていただいたコメントもありますので、 このコメントとは分けて書き込みするようにしますね。 > itemにはattributeが全て入っているという認識でいいでしょうか? その認識でOKと思います。 Entityは確か、裏ではClassの定義が作られているはずですので、 そのインスタンスには定義したAttribute(プロパティ)が存在すると思います。 https://developer.apple.com/documentation/coredata/modeling_data/generating_code
退会済みユーザー

退会済みユーザー

2023/04/02 06:00

ご説明ありがとうございます。 > A, B, C(わかりやすくA, B, C)のヘッダーとセクションのListがあり、 さらに親の画面があるのですね。 ちょっとこの質問の問題を大きくしてしまいそう(問題をぼやけさせてしまいそう)な情報なので、 この情報は回答者を混乱させてしまいそうな感じもしますね・・ *でも、提供しなかった情報のために、  後から「そういうことなら最初に言ってくれれば別の方法もあったのに」ということもありますので、  何が必要かの判断は難しいですね・・ > あとは(いままでのAnotherViewに)ToolbarItemに遷移して、ContentViewの Listに追加していく やっぱりToolbarItemのボタンをタップした時は 「新たにデータを追加する」 という意味なのだと思うのですが合っていますでしょうか? (iPhoneのメモアプリだと、右下の作成アイコンのようなものです) (質問欄のコードでは、ToolbarItemのボタンのラベルにitem.textを表示していたようですので、既存のデータに対して何かしようとしているように見えました) > そのため、A, B, CのListのセルは自作のセルに とおもっていますが、 それもまたインスタンスの面でエラーが出る 開発の進め方ですが、 少しずつエラーを解消しながら、 シミュレーターで動かしながら、 進めていますでしょうか? エラーがあるまま他の機能の実装をしてしまうと、 問題を解消するのがどんどん大変になってしまいそうでしたので、 書いてみました。
ruru313245

2023/04/02 06:52

おっしゃる通り、話を大きくしてしまうので、A, B, CのViewのことはわすれてください iPhoneのメモの右下のとおりです わたしはそのつもりで話していました、。 お察しのとおり、エラーの上に機能を乗せて、じょじょに解消 というルートをたどっています
退会済みユーザー

退会済みユーザー

2023/04/02 07:30

> iPhoneのメモの右下のとおりです わたしはそのつもりで話していました、。 ちゃんと理解できず、ごめんなさい。 では、ToolbarItemのボタンのラベルは、item.textではなく、作成アイコンみたいな感じになりますか? ここからは、どのように設計するか、いくつか方針がありそうなのですが、 ToolbarItemで扱うのは新しいデータですので、ToolbarItemのNavigationLinkからはItemのインスタンスを渡さないで、 AnotherAnotherViewの中で新しく生成する感じはいかがでしょうか? *AnotherAnotherViewとAnotherViewって、実際のアプリ(質問欄のコードではなく)でも別物ですか? > お察しのとおり、エラーの上に機能を乗せて、じょじょに解消 というルートをたどっています そうなのですね。 エラーが発生したら、機能の追加・修正の前に、まずエラーを解消する、 ようになると良いかもしれないですね。
ruru313245

2023/04/02 07:39 編集

こちらこそ、すみません ToolbarItemのlabelはImage(systemName: "square.and.allow.down")になります。 質問も編集しておきます。 実際にも別ものです。 ContentView、AnotherView、AnotherAnotherView、…となります。 ありがとうございます。 心がけます。
ruru313245

2023/04/02 07:45

AnotherAnotherViewの中で、新しく生成することができるのですか? 渡さなくて済むならそれにこしたことはありません
ruru313245

2023/04/19 07:22

こんばんは その後、わたし自身ですすめてみたのですが、 あたらしく質問を立てるとコードがコピーしづらくなると思いますので、こちらに記述させていただきます。 以下のコードで、一点だけ、遷移の際のEntityについての言及でエラーが出ます。 お手隙でしたら、ご確認をお願いします --- struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], animation: .default) private var items: FetchedResults<Item> var body: some View { NavigationView { List { Section(header: Text("Section1")) { NavigationLink(destination: ArrayView(item: Item), label: { ListRow(a: "テキスト", b: "pin", c: [""])}) }} .toolbar { ToolbarItem(placement: .navigationBarTrailing) { EditButton() } } } .navigationTitle("A") .scrollContentBackground(.hidden) .background(.white) } } struct ListRow: View { var a = "テキスト" var b = "テキスト" var c = [""] var body: some View { HStack{ Image(systemName: b) Text(a) Spacer()}}} struct SampleStruct : View, Identifiable { let id = UUID() let sectionTitle: String let listContent: [String] let systemNameText: String let folderRowName: String var body: some View { HStack{ Image(systemName: systemNameText) Text(folderRowName) Text("\(systemNameText.count)") } } } struct ArrayView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: false)], animation: .default) private var items: FetchedResults<Item> var item: Item var body: some View { List { ForEach(items) { item in NavigationLink { AnotherView(item: item) } label: { Text(item.text ?? "") } } .onDelete(perform: deleteItems) } .toolbar { #if os(iOS) ToolbarItem(placement: .navigationBarTrailing) { EditButton() } #endif ToolbarItem { Button(action: addItem) { Label("Add Item", systemImage: "plus") } } } Text("Select an item") } private func addItem() { withAnimation { let newItem = Item(context: viewContext) newItem.timestamp = Date() do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } } private func deleteItems(offsets:IndexSet) { withAnimation { offsets.map { items[$0] }.forEach(viewContext.delete) do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } } } private let itemFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .medium return formatter }() struct AnotherView: View { @Environment(\.managedObjectContext) private var viewContext @State var textEditorText = "" var item: Item init(item: Item) { _textEditorText = State(initialValue: item.text ?? "") self.item = item } var body: some View { TextEditor(text: $textEditorText).frame(width: .infinity, height: .infinity) .toolbar { ToolbarItem(placement: .navigationBarLeading){ Button(action: {additem()}) {Image(systemName: "heart")}} } } func additem () { withAnimation { item.text = textEditorText do { try viewContext.save() } catch { let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } }} struct SettimgView: View { @State var flag1 = false var body: some View { List{Section(header: Text("背景色")){Toggle(isOn: $flag1) {}}}} } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } }
退会済みユーザー

退会済みユーザー

2023/04/19 08:25

コメントありがとうございます。 (回答者がここにコメントしても通知が届かないと思いますが・・) 一つにするとコードが大きくなってきましたね。 ContentViewの `NavigationLink(destination: ArrayView(item: Item), label: {` の行のところで 「Cannot convert value of type 'Item.Type' to expected argument type 'Item'」 のビルドエラーが発生しているのを解消したいということでよろしいでしょうか? やっぱりデータの持ち方について気になりますので、 直接お話ししたいと思ったりしますね・・
ruru313245

2023/04/19 09:39

こんばんは ご回答ありがとうございます 気にしていたのに、気付きませんでした すみません、、 ContentViewの `NavigationLink(destination: ArrayView(item: Item), label: {` の行のところで 「Cannot convert value of type 'Item.Type' to expected argument type 'Item'」 のビルドエラーが発生しているのを解消したい、ということでいいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問