Posts

Post not yet marked as solved
0 Replies
171 Views
I'm trying to setup a filter option for some core data records, but I'm not seeing the expected results. Essentially, what I want is to have multiple sections. Within each section it would be an OR query, and an AND between each section. I've tried setting it up as below. func getBasicFilter() -> NSPredicate? { var predicatesBagsLeft : [NSPredicate] = [] var predicatesDrillType : [NSPredicate] = [] var andPredicates : [NSPredicate] = [] print("Filter List") print(filters) // Bags Left if let show = filters["showFullLeft"] { if show { print("Predicates : Show Full") let predicate = NSPredicate(format: "ANY projectColours.fullLeft > 0") predicatesBagsLeft.append(predicate) } } if let show = filters["showPartialLeft"] { if show { print("Predicates : Show Partial") let predicate = NSPredicate(format: "ANY projectColours.partialLeft > 0") predicatesBagsLeft.append(predicate) } } // Drill Types if let show = filters["showSquareOnly"] { if show { print("Predicates : Show Square Only") let predicate = NSPredicate(format: "ANY projectColours.project.drillType = %@", "Square") predicatesDrillType.append(predicate) } } // Drill Manufacturers - TO DO // Combine Predicates if predicatesBagsLeft.count > 0 { let predicatesForBagsLeft = NSCompoundPredicate(type: .or, subpredicates: predicatesBagsLeft) andPredicates.append(predicatesForBagsLeft) } if predicatesDrillType.count > 0 { let predicatesForDrillType = NSCompoundPredicate(type: .or, subpredicates: predicatesDrillType) andPredicates.append(predicatesForDrillType) } if andPredicates.count > 0 { let predicates = NSCompoundPredicate(type: .and, subpredicates: andPredicates) return predicates } return nil } It does filter, but doesn't seem to be applying both correctly. I'm testing with a filter of showFullLeft & showSquareOnly, so it should show only squares which have a a fullest > 0 I'm getting 7 results back, but one of them is unwanted. It is square, but it has 0 for both full & partial When I look at the query core data is using it looks correct CoreData: sql: SELECT t0.ZMANU, COUNT (DISTINCT t0.Z_PK) FROM ZCOLOUR t0 JOIN ZPROJECTCOLOUR t1 ON t0.Z_PK = t1.ZCOLOUR JOIN ZPROJECTCOLOUR t2 ON t0.Z_PK = t2.ZCOLOUR JOIN ZPROJECT t3 ON t2.ZPROJECT = t3.Z_PK WHERE ( t1.ZFULLLEFT > ? AND t3.ZDRILLTYPE = ?) GROUP BY t0.ZMANU ORDER BY t0.ZMANU CoreData: details: SQLite bind[0] = 0 CoreData: details: SQLite bind[1] = "Square"
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
134 Views
I'm trying to move an app over to swiftui and have run into a couple of issues involving quick actions. I'm trying to get the app to respond to the action. I have a CustomSceneDelegate setup, which is receiving the actions. How do I get it to navigate to a view when the addProject is used, and how do I get a core data query in the addTime? class CustomSceneDelegate: UIResponder, UIWindowSceneDelegate { func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { handleShortcutItem(shortcutItem) } func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem) { if shortcutItem.type == "addProject" { print("Phase: Add Project") } else if shortcutItem.type == "addTime" { print("Phase: Add Time") } } }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
1 Replies
245 Views
I'm trying to do a mass conversion of images to data so it can be stored in core data. The conversion part works fine, and if I do it without updating core data it shows memory usage at less that 100MB If I update the core data object, it just keeps consuming memory until the app crashes. func updateLocalImages() { let fetchRequest: NSFetchRequest<Picture> = Picture.fetchRequest() fetchRequest.predicate = NSPredicate(format: "pictureName != \"\"") do { let pictures = try moc.fetch(fetchRequest) print("Picture Update Count: \(pictures.count)") for picture in pictures { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let path = paths[0] if let picName = picture.pictureName { let imagePath = path.appendingPathComponent(picName) if let uiImage = UIImage(contentsOfFile: imagePath.path) { if let imageData = uiImage.jpegData(compressionQuality: 1.0) { autoreleasepool { picture.pictureData = imageData print("Picture Updated") saveContext() } } } } } } catch { print("Fetching Failed") } } If I comment out the picture.pictureData = imageData line I don't get the memory issues. What's the correct way of going about this? There is an unknown number of images (mine current sits at about 5.5GB worth, 800+)
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
202 Views
I have a SwiftData class which has an attribute of var dimObject : DIM? I'm trying to assign a DIM object to that attribute, buts its randomly failing with Thread 1: EXC_BAD_ACCESS (code=1, address=0x8000000000000010) Its never the same object, nor do I get any further indications of what's causing it. I've narrowed it down to digimon.dimObject = dimFound in the below function func insertDigimon(digimon: Digimon) { Thread.sleep(forTimeInterval: 1) if let dimFound = getDIMFromID(dimID: digimon.dim) { print("****************************************************************") print("Digimon: \(digimon.name) - ID: \(digimon.id)") print("DIM: \(dimFound.name)") print("Set DIM Object on Digimon") digimon.dimObject = dimFound print("Digimon object set") print("Add digimon to DIM") dimFound.addToDigimon(d: digimon) print("Digimon added to DIM") } modelContext.insert(digimon) } If I comment out that line, there's no error Both the digimon and dimFound objects aren't nil and contain the expected object.
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
1 Replies
621 Views
I have the below fetch request which I want to be able to dynamically change the setup of. The request is setup initially as         sectionIdentifier: \.level,         sortDescriptors: [NSSortDescriptor(keyPath: \Card.level, ascending: true),                           NSSortDescriptor(keyPath: \Card.setID, ascending: true),                           NSSortDescriptor(keyPath: \Card.cardID, ascending: true),                           NSSortDescriptor(keyPath: \Card.name, ascending: true)],         animation: .default)     private var cards: SectionedFetchResults<Int16, Card> I've got the predicate change working fine, but get errors with the sort descriptors and the section identifier On setting the sort descriptors I get the error Cannot convert value of type 'NSSortDescriptor' to expected element type 'Array<SortDescriptor>.ArrayLiteralElement' (aka 'SortDescriptor') And setting the section identifier I get Cannot assign value of type 'SectionedFetchResults<String, Card>.Type' to type 'KeyPath<Card, Int16>' The code I have is below.                 if groupBy == 2 {                     cards.nsPredicate = nil                     let sortSetID = NSSortDescriptor(keyPath: \Card.setID, ascending: true)                     let sortName = NSSortDescriptor(keyPath: \Card.name, ascending: true)                     cards.sortDescriptors = [sortSetID, sortName] // This errors                     cards.sectionIdentifier = SectionedFetchResults<String, Card> // This errors                 }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
244 Views
I'm trying to adjust a list so that it can have multiple selection. It works when I use hard coded data, but when I try and use it with core data, the option to edit the list doesn't bring the checkboxes up. Working code struct DIMTest: Identifiable { let id = UUID() let name: String } struct DimTypeListView: View { let contacts = [ DIMTest(name: "John"), DIMTest(name: "Alice"), DIMTest(name: "Bob") ] // 2 @State private var multiSelection = Set<DIM>() var body: some View { NavigationView { VStack { // 3 List(contacts, selection: $multiSelection) { contact in Text(contact.name) } Text("\(multiSelection.count) selections") } .navigationTitle("Contacts") .toolbar { // 4 EditButton() } } } } but when I adjust the code to the below to load from core data, I don't get the checkboxes @SectionedFetchRequest var dims: SectionedFetchResults<Bool, DIM> init(dType: DimType) { _dims = SectionedFetchRequest<Bool, DIM>( sectionIdentifier: \.favourite, sortDescriptors: [NSSortDescriptor(keyPath: \DIM.favourite, ascending: false), NSSortDescriptor(keyPath: \DIM.name, ascending: true)], predicate: NSPredicate(format: "dimType = %@", dType) ) } @State private var multiSelection = Set<DIM>() var body: some View { VStack { List(dims, selection: $multiSelection) { section in Section() { ForEach(section) { dim in Text("Name") } } } Text("\(multiSelection.count) selections") } .navigationTitle("DIMs") .toolbar { EditButton() } } It shows the correct number of entries, but can't be selected If i add an onDelete, i get the delete options but only want to be able to select, not delete
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
1 Replies
1k Views
I have a list with sections headers on two views. One view has the section headers as collapsible, the other doesn't. Both use pretty much the same code, what defines if a section header is collapsible? Code for the one that doesn't collapse ForEach(cards) { section in let header: String = nameForSectionHeader(sectionID: section.id) Section(header: Text(header)) { ForEach(section) { card in NavigationLink(destination: CardView(card: card)) { HStack { Image(card.imageName ?? "") .renderingMode(.original) .resizable() .scaledToFit() .frame(width: 50.0) VStack(alignment: .leading) { if let name = card.name, let id = card.cardID { Text("\(id) - \(name)") } Text("Owned: \(card.owned)") } } } } } } } and the code for the one that does ForEach(cards) { section in let header: String = nameForSectionHeader(sectionID: section.id) Section(header: Text(header)) { ForEach(section) { card in NavigationLink(destination: CardView(card: card)) { VStack(alignment: .leading) { if let name = card.name, let id = card.cardID { Text("\(id) - \(name)") } if let set = card.set, let setName = set.name { Text("Set: \(setName)") } if card.owned > 0 { Text("Owned: \(card.owned)") } } } } } } .listRowBackground(lightGreen) }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
243 Views
I have a list view created from core data, and it's sectioned by a property called favourite. In the detail view a user is able to either add an item or remove it as a favourite. When the property is updated, it causes the detail view to pop back to the list view, which I don't want it to do, and don't know how to get it to not do that The creation of the list @SectionedFetchRequest var dims: SectionedFetchResults<Int16, DIM> init() { _dims = SectionedFetchRequest<Int16, DIM>( sectionIdentifier: \.favourite, sortDescriptors: [NSSortDescriptor(keyPath: \DIM.favourite, ascending: false), NSSortDescriptor(keyPath: \DIM.name, ascending: true)] ) } List { ForEach(dims) { section in let header: String = nameForSectionHeader(sectionID: section.id) Section(header: Text(header)) { ForEach(section) { dim in NavigationLink(destination: DIMListView(dim: dim)) { } } } } } and then on the detail view there's a toolbar with an option to add/remove favourite. .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button("Options") { showingAlertFav = true } .alert("Choose an option", isPresented: $showingAlertFav) { if dim.favourite == 0 { Button("Favourite", role: .none) { setFav(fav: 1) } } else { Button("Unfavourite", role: .none) { setFav(fav: 0) } } } } } func setFav(fav : Int16) { dim.favourite = fav saveContext() }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
1 Replies
734 Views
Xcode keeps complaining about changes when I try and commit, I get the error "The local repository is out of date." When I try and pul changes from the remote, I get the message "Your local repository has uncommitted changes that need to be stashed before you can continue. " When I try and commit, every time it shows a UserInterfaceState.xcuserstate file. if I try and commit it I get the local repository error.
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
263 Views
I'm looking to see if its possible to change the background colour of a cell, but fill it based on a percentage I'm creating the cell in a List {} let gradient = LinearGradient(colors: [.green, .white], startPoint: .leading, endPoint: .trailing) List { Section(header: Text("Total")) { Text("Total Obtained: \(totalObtained) - \(totalComplete)%") .listRowBackground(gradient) } } totalComplete has the percentage variable
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
2 Replies
355 Views
I'm currently using a navigationview and am now getting an warning 'init(destination:tag:selection:label:)' was deprecated in iOS 16.0: use NavigationLink(value:label:) inside a List within a NavigationStack or NavigationSplitView I'm trying to move to another view from a button (there will be several hence using tags) but I can't seem to get my head around how to do it. The code I currently have var body: some View { List { NavigationLink(destination: ProjectColourAddView(project: project), tag: 1, selection: $action) { EmptyView() } Group { Button(action: { self.showImageMenu = true }) { Text("New Title Image") } .confirmationDialog("Select Image Source", isPresented: $showImageMenu, titleVisibility: .visible) { Button("Take Photo") { self.isShowCamera = true } Button("Choose from Albums") { self.isShowPhotoLibrary = true } } Button(action: { self.action = 3 NSLog("More Images") }) { Text("More Images (x)") } Button(action: { self.action = 2 NSLog("Add Image") }) { Text("Add Image") } Button(action: { self.action = 1 NSLog("Colour List") }) { Text("Colour List") } } } }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
540 Views
My App does some importing when its first setup. I have it set to store core data in cloud kit. My issue is if you run it on one device, everything imports fine. Run it on a second, and it will import for a second time, duplicating the records. I'm trying to see if there's a way of checking if there is anything in cloud kit before running the import, but I'm always getting back false, even if I know there are records. The code I'm using to check is NSLog("Existance Check") checkIfExistsInCloudKit() { (result) in print(result) if result == false { NSLog("Does Not Exist") //let ImportData : ImportData = ImportData(viewContext: viewContext) //ImportData.importAll() } else { NSLog("Does Exist") } } NSLog("Existance Check Complete") and the function is func checkIfExistsInCloudKit(_ completion: @escaping (Bool) -> ()) { var result = false let container = CKContainer(identifier: "******") let privateDB = container.privateCloudDatabase let predicate = NSPredicate(format: "CD_brand = %@", "DMC") let query = CKQuery(recordType: "CD_Colour", predicate: predicate) privateDB.perform(query, inZoneWith: nil) { records, error in //guard let records = records else { return } result = true } completion(result) } 2023-04-15 14:07:28.092262+0100 Stitchers Companion[4553:113693] Existance Check false 2023-04-15 14:07:28.092897+0100 Stitchers Companion[4553:113693] Does Not Exist 2023-04-15 14:07:28.092962+0100 Stitchers Companion[4553:113693] Existance Check Complete
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
0 Replies
314 Views
I'm trying to change the background colour of a row in a list based on a value I have an Int16 value stored in card.owned and I want to change the background if this value is above 0, otherwise use the normal background. Previously with a table view I could change it with the cellForRowAtIndexPath method, but not sure how to do it with SwiftUI without changing every row Currently I have ForEach(cards) { section in let header: String = nameForSectionHeader(sectionID: section.id) Section(header: Text(header)) { ForEach(section) { card in NavigationLink(destination: CardView(card: card)) { VStack(alignment: .leading) { if let name = card.name, let id = card.cardID { Text("\(id) - \(name)") } if let set = card.set, let setName = set.name { Text("Set: \(setName)") } if card.owned > 0 { Text("Owned: \(card.owned)") } } } } } } .listRowBackground(lightGreen) }
Posted
by Desbrina.
Last updated
.
Post marked as solved
2 Replies
358 Views
I have the below code for my view's body Currently when I go to the ItemDetailView View and then press back to return to this view, the filtered list is no longer there, it's back the full view. How to I get it to keep the filtered list when I go back? The text is still in the search bar         NavigationLink(destination: ItemAddView(series: series), isActive: $noItemsShowing) { EmptyView() }         List {             ForEach(items) { item in                 NavigationLink(destination: ItemDetailView(item: item)) {                     Text(fullItemName(item: item))                 }             }         }         .searchable(text: $searchText)         .onSubmit(of: .search) {             items.nsPredicate = NSPredicate(format: "series = %@", series)             if(!searchText.isEmpty) {                 items.nsPredicate = NSPredicate(format: "series = %@ AND amount > 0 AND name CONTAINS[cd] %@", series, searchText)             }         }         .onChange(of: searchText) { _ in             items.nsPredicate = NSPredicate(format: "series = %@", series)             if(!searchText.isEmpty) {                 items.nsPredicate = NSPredicate(format: "series = %@ AND amount > 0 AND name CONTAINS[cd] %@", series, searchText)             }         }         .navigationBarTitle("\(series.name ?? "Error") Items", displayMode: .inline)     }
Posted
by Desbrina.
Last updated
.
Post not yet marked as solved
3 Replies
1.7k Views
I'm currently sharing data between devices using core data and cloud kit.Currently I have a "Picture" entity which stores the filename, the date it was added and a relation to another entity.The details in core data successfully syncs, how would I go about syncing the image file. The file is saved in the documents folder and I can get its file path usinglet imagePath = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent(imageName)Research seems to show I need to use CKAsset to upload/download the file but how do I go about doing this?
Posted
by Desbrina.
Last updated
.