Post

Replies

Boosts

Views

Activity

TabView Item Back to Main View
So I have a TabView in my app and I want to go back yo the main view when that tabItem is pressed. For example, when you open the App Store and go to the games tab, click on a game. It takes you to a navigation link to a new view. You can either go back to the first page by pressing the arrow, or by tapping the “games” tabItem again. I want to be able to press my tabItem in a subview of the same tab to go back to the original view that the tab is assigned to.
0
0
621
Jun ’22
Combine Duplicate Items in an Array
I have an object called Item with two attributes, name (String) and value (Double). Given an array of Items I need combine the values of all items with the same name and keep the items with no duplicates. For example, say there were 4 items in the array and two of them named "Test" and the others "Object" and "Item". "Object" and "Item" would remain in the list, but the values of the two "Test"s would be combined into one item with the same name "Test". I've included the following code for a visual representation. Delete the comments as you read them to clean up. They're just there to clear up any confusion. Leave a comment if you have any questions. Thanks for the help! Content View: import SwiftUI import CoreData struct ContentView: View {     @Environment(\.managedObjectContext) var managedObjContext     @ObservedObject var persistence = PersistenceController.shared     @State private var items = PersistenceController.shared.getItems()          @State var isAddViewShowing = false     var body: some View {         NavigationView{             List{                 Section{                     ForEach(items) { item in //Displays the list of items                         HStack{                             Text(String(item.name!))                             Spacer()                             Text(String(Int(item.value)))                         }                     }                     .onDelete(perform: { indexSet in                         deleteItem(indexSet: indexSet)                     })                 }             }             .navigationBarTitle("Items")             .navigationBarItems(leading: combineItemsButton, trailing: addButton)             .sheet(isPresented: $isAddViewShowing){ //displays the view to add an item                 AddView()                     .onDisappear(perform: {                         items = persistence.getItems() //"refreshes" the list of items                     })             }         }     }          var combineItemsButton: some View{         Button(action:{ //combine duplicates here             persistence.contextSave()             items = persistence.getItems()         }){             Text("Combine Duplicates")                 .bold()         }     }          var addButton: some View{         Button(action:{             isAddViewShowing.toggle()         }){             Text("Add Item")                 .bold()         }     }          func deleteItem(indexSet: IndexSet){         withAnimation{             indexSet.map {                 items[$0]             }             .forEach(managedObjContext.delete)                          persistence.contextSave()             items = persistence.getItems()         }     } } Add View: struct AddView: View{     @Environment(\.dismiss) var dismiss     @ObservedObject var persistence = PersistenceController.shared          @State var name: String = ""     @State var value = ""     @State private var alertMessage = ""     @State private var showAlert = false     var body: some View{         NavigationView{             Form{                 TextField("Item Name", text: $name)                 TextField("Item Value", text: $value)                     .keyboardType(.decimalPad)             }             .navigationBarTitle("Add Item")             .navigationBarItems(leading: dismissButton, trailing: submitButton)         }     }     var submitButton: some View{         Button(action: {             if (name == ""){ //ensures the item has a name                 alertMessage="Your recipe needs a name"                 showAlert.toggle()             } else {                 persistence.addItem(name: name, value: Double(value) ?? 2)                 dismiss()             }         }){             Text("Submit")                 .bold()         }         .alert(alertMessage, isPresented: $showAlert){             Button("OK",role: .cancel){}         }     }          var dismissButton: some View{         Button(action: {             dismiss()         }){             Text("Cancel")                 .bold()         }     } } Persistence File: import CoreData class PersistenceController : ObservableObject{     static let shared = PersistenceController()     let container: NSPersistentContainer          init(inMemory: Bool = false) {         container = NSPersistentContainer(name: "Test")         if inMemory {             container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")         }         container.loadPersistentStores(completionHandler: { (storeDescription, error) in             if let error = error as NSError? {                 fatalError("Unresolved error \(error), \(error.userInfo)")             }         })         container.viewContext.automaticallyMergesChangesFromParent = true     }          func getItems() -> [Item] { //fetches items         let context = container.viewContext         var request = NSFetchRequest<Item>()         request = Item.fetchRequest()         request.entity = NSEntityDescription.entity(forEntityName: "Item", in: context)         do {             let items = try context.fetch(request)             if items.count == 0 { return []}             return items.sorted(by: {$0.name! > $1.name!})         } catch {             print("**** ERROR: items fetch failed \(error)")             return []         }     }          func addItem(name: String, value: Double){         let context = container.viewContext         let item = Item(context: context)         item.id = UUID()         item.name = name         item.value = value                  contextSave()     }          func contextSave() {         let context = container.viewContext         if context.hasChanges {             do {                 try context.save()                 self.objectWillChange.send()             } catch {                 print("**** ERROR: Unable to save context \(error)")             }         }     } } Data Model:
2
0
2.1k
Jun ’22
Calendar with Correlating Data. Please Help!!!
Basically I need a view with a calendar that will show data attributes from the item. I've tried two different approaches both have their listed problems. There must be a better way to do something like this. Surely it's not ideal to create a new item every time a date is opened or constantly check if something is there, but I don't know any other way. Actual View: import SwiftUI import CoreData struct ContentView: View {     @Environment(\.managedObjectContext) var managedObjContext     @Environment(\.calendar) var calenda     @Environment(\.dismiss) var dismiss     @FetchRequest(sortDescriptors: [], predicate: NSPredicate(format: "timestamp == %@", Date.now as CVarArg)) var items: FetchedResults<Item>          @State private var date = Date.now          var body: some View {         NavigationView{             VStack{                 DatePicker("Calendar", selection: $date, in: Date.now...,displayedComponents: [.date])                     .datePickerStyle(.graphical)                     .onAppear(perform: {                         if (items.isEmpty){                             PersistenceController().addItem(date: date, context: managedObjContext)                         }                     })                     .onChange(of: date){ value in                         items.nsPredicate=NSPredicate(format: "timestamp == %@", date as CVarArg)                         if (items.isEmpty){                             PersistenceController().addItem(date: date, context: managedObjContext)                         }                     }                 if (!items.isEmpty){ //This is the only difference in the two approaches. I just put either one of the next two blocks of code in here                 }             }             .navigationBarTitle("My Planner")         }     }          func getTitle(date: Date)->String{         let formatter = DateFormatter()         formatter.dateStyle = .medium         return formatter.string(from: date)     } } First (looks correct, but doesn't show the changes live): PlannedMealsView(item: items[0]) Spacer() //And then this is added at the bottom struct PlannedMealsView: View {     @Environment(\.managedObjectContext) var managedObjContext     @State var item: Item     var body: some View {             VStack{                 Text(item.timestamp ?? Date.now, style: .date)                     .font(.title2)                     .bold()                 Section("Word"){                     if(item.word != nil){                         HStack{                             Spacer()                             Text(item.word!)                             Spacer()                             Button(action: {                                 PersistenceController().removeFromItem(item: item, context: managedObjContext)                             }){                                 Image(systemName: "minus.circle").bold()                             }                             Spacer()                         }                     } else {                         Button(action: {                             PersistenceController().addToItem(item: item, context: managedObjContext)                         }){                             Image(systemName: "plus.circle").bold()                                 .padding(.vertical, 10)                                 .padding(.horizontal, 20)                         }                     }                 }                 Spacer()             }             .frame(height:200)     } } Second (allows direct access to the objects data, but bugs after 5 or 6 date changes): VStack{                             Text(items[0].timestamp ?? Date.now, style: .date)                                 .font(.title2)                                 .bold()                             Section("Word"){                                 if(items[0].word != nil){                                     HStack{                                         Spacer()                                         Text(items[0].word!)                                         Spacer()                                         Button(action: {                                             PersistenceController().removeFromItem(item: items[0], context: managedObjContext)                                         }){                                             Image(systemName: "minus.circle").bold()                                         }                                         Spacer()                                     }                                 } else {                                     Button(action: {                                         PersistenceController().addToItem(item: items[0], context: managedObjContext)                                     }){                                         Image(systemName: "plus.circle").bold()                                             .padding(.vertical, 10)                                             .padding(.horizontal, 20)                                     }                                 }                             }                         Spacer()                     }                     .frame(height:200) Unchanged Files: Persistence- import CoreData struct PersistenceController {     static let shared = PersistenceController()     let container: NSPersistentContainer     init(inMemory: Bool = false) {         container = NSPersistentContainer(name: "Test")         if inMemory {             container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")         }         container.loadPersistentStores(completionHandler: { (storeDescription, error) in             if let error = error as NSError? {                 fatalError("Unresolved error \(error), \(error.userInfo)")             }         })         container.viewContext.automaticallyMergesChangesFromParent = true     }          func addItem(date: Date, context: NSManagedObjectContext){         let item = Item(context: context)         item.timestamp = date         item.word = nil                  save(context: context)     }          func addToItem(item: Item, context: NSManagedObjectContext){         item.word = "Test"                  save(context: context)     }          func removeFromItem(item: Item, context: NSManagedObjectContext){         item.word = nil                  save(context: context)     }          func save(context: NSManagedObjectContext){         do {             try context.save()         } catch {             let nsError = error as NSError             fatalError("Unresolved error \(nsError), \(nsError.userInfo)")         }     } } Data Model- If you have any questions I'll be happy to answer. Any help is greatly appreciated. All the best!
2
0
1.6k
Jun ’22
Calendar That Stores Data
Does anyone know the best way to store core data using a calendar? The only way I could think is adding a date attribute and every time the date is changed on the calendar changing the NSPredicate to that date and if there isn’t one creating a new instance with that date as it’s date value. I’m certain this is not the best method, but I couldn’t think of any other, but I know I’m very limited in my SwiftUI knowledge. So any guidance would be greatly appreciated. For more insight into what I’m looking for see my previous post asking for advice on what to change about my own method: https://developer.apple.com/forums/thread/708915
0
0
917
Jun ’22
View References
I need to edit an attribute of a core data entity fetched in a previous view. So I put var entityName: FetchedResults.Elementin the second view to get access to the entity. But when I do this it doesn't actually get the entity it gets a copy of the entity so when changes are made to it it doesn't actually change. Basically is there a way to pass a reference to an attribute of an object to a struct so that when you set that reference to a value the entity changes? Any help would be greatly appreciated. All the best!
1
0
570
Jun ’22
Dismissing a Sheet That Doesn't Call Another View
I need to dismiss a sheet that doesn't call a view inside of it instead it makes it's own view. The reason this is necessary is because the view changes an attribute of an object in the previous view which won't update unless the attribute is changed in the same struct. Is there any way I could dismiss the view without swiping down in this way? Or a way I can pass a reference to the attribute so that when I change it in a separate struct it will update live in a previous one I'm sorry for my super confusing explanation. I've simplified my actual implemented code to the following: struct ContentView: View {     @Environment(\.dismiss) var dismiss     @State var word = ""     @State private var isSheetShowing = false     var body: some View {         NavigationView{             Form{                 TextField("Change Word", text: $word)                 Button(action: {                     isSheetShowing.toggle()                 }){                     Text("Done")                         .bold()                 }                 .sheet(isPresented: $isSheetShowing){                     NavigationView{                         List{                             Text("Hello User")                         }                         .navigationBarItems(leading:                                                 Button(action: {                             dismiss()                         }){                             Text("Cancel")                                 .bold()                         })                     }                 }             }         }     } } Pressing cancel in the sheet does not dismiss the view as I want it to.
2
0
506
Jun ’22
Changing Views Bar
I’ve been looking for how to do this for AGES and I’ve finally found and app made in Swift that has it. So I really need a bar that stays at the bottom of my screen even when scrolling or changing views that has buttons on it that takes the user to a different view. And I don’t mean like a NavigationLink with a back button and a sliding transition. I mean I want it to open a whole new view and save the user’s location in the other view so when they press the button to return to the previous view they continue where they left off. This is the GitHub app and they’ve executed exactly what I need: To be clear this is what I’m talking about: If anyone has a repository or a YouTube tutorial that has something like this I would be SO grateful. Thanks! :)
2
0
562
Jun ’22
EditView Reference is Broken
I've made a simplified version of what I'm trying to do in the included code, but basically I'm trying to make a view that edits a data model. This edit view shows up when a button in a context menu is clicked. The problem is no matter which one I open up the context menu on it always opens up whichever one I clicked first. The reference to the object in the .sheet never changes. How can I fix this?? Example Code: import SwiftUI class Object: Identifiable{     var id: UUID?     var title: String     var string: String        init(title: String, string: String) {         self.id = UUID()         self.title = title         self.string = string     } } struct ContentView: View {     @State private var showingEditView = false     @State private var objectList = [Object(title: "First", string: "Editor"), Object(title: "Second", string: "Addition"), Object(title: "Third", string: "Twelve")]     var body: some View {         NavigationView{             List{                 Section("Objects"){                     ForEach(objectList) { object in                         NavigationLink(destination: ObjectView(obj: object)){                             Text(object.title)                         }                         .sheet(isPresented: $showingEditView){                             EditView(obj: object)                         }                     }                 }                 .contextMenu{                     Button(action: {                         self.showingEditView.toggle()                     }){                         Text("Edit Item")                     }                 }             }             .listStyle(InsetGroupedListStyle())             .cornerRadius(10)             .navigationBarTitle("My List")         }     } } struct ContentView_Previews: PreviewProvider {     static var previews: some View {         ContentView()     } } struct ObjectView: View {     @State var obj: Object     var body: some View {         NavigationView{             VStack{                 Text(obj.string)             }             .navigationBarTitle(obj.title)         }     } } struct EditView: View {     @Environment(\.dismiss) var dismiss     @State var obj: Object     @State var word = ""     var body: some View {         NavigationView{             Form{                 TextField("Change Word", text: $word)                     .onAppear(perform: {                         word = obj.string                     })             }             .navigationBarItems(trailing:             Button(action: {                     dismiss()             }){                 Text("Done")                     .bold()             })         }     } } Any help would be greatly appreciated. All the best!
2
0
423
Jun ’22
Optional Type Date
I'm sorry I know this is basic swift, but how do I get I make the selection an optional return? I know it's with ?? "" with a string, but I don't know how to do it with a date type. Also how do I get a navigationBarTitle to work on this view? The "My Calendar" doesn't show up when I run the code. import SwiftUI struct ReciPrep: View {     @State private var date: Date? = ni     @Environment(\.calendar) var calendar          @State private var showingAddView = false     var body: some View {         VStack{             DatePicker("Calendar", selection: $date, in: Date.now...,displayedComponents: [.date]) //Error: Cannot convert value of type 'Binding<Date?>' to expected argument type 'Binding<Date>'                 .datePickerStyle(.graphical)             Spacer()         }         .navigationBarTitle("My Calendar")     } } Any help would be greatly appreciated. Have a good day!
2
0
2.5k
Jun ’22
Time Wheel Picker
I need a wheel picker for hours and minutes. I've found stuff online but it does have the "Hours" and "Minutes" right after and it isn't as compact. Is there a newer way to accomplish this to look exactly like it does in the timer app?
2
0
1.8k
Jun ’22
FetchedResults to Array (Error)
So I've found a way to convert fetched results to an array of the same data type, and not only that but filter them with the fetch request given a string: func searchResults(searchingFor: String)->[Recipe]{     var filteredRecipeList=[Recipe]()     @FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)], predicate: NSPredicate(format: "title CONTAINS[c] %@",searchingFor)) var filteredResults: FetchedResults<Recipe>     for recipe in filteredResults {         filteredRecipeList.append(recipe)     }     return filteredRecipeList } To clarify, this would ideally return an array with a list of Recipes that contain the given string in the title. In theory this should work just fine, but I'm getting a weird error. I've never seen an error like this and I'm not sure how to understand it. It is purple with a yellow warning. The error says "Accessing StateObject's object without being installed on a View. This will create a new instance each time." How do I get around this issue to accomplish what I'm trying to accomplish. Thanks in advance for any help whatsoever. I'll upvote anyone with any bit of helpful information. Have a good one!
2
1
2.3k
Jun ’22