Post not yet marked as solved
The Encoder and Decoder protocols have this property: var codingPath: [CodingKey] { get }
In my own custom coding class, how do I override this and pass valid CodingKeys? Every document and code example uses the enum to define coding keys.
Thanks.
Post not yet marked as solved
I have a view with @Bindable property. (It's a model)
I can use TextField("Name", text: $chore.name), but not Picker(selection: $chore.choreFrequency, label: EmptyView())
The auto-complete doesn't even show choreFrequency as an option
enum ChoreFrequency: String, CaseIterable, Identifiable, Codable {
case daily, weekly, monthly, seasonal
var id: ChoreFrequency { self }
}
@Model
class Chore: Identifiable {
@Attribute(.unique) var id = UUID()
var name: String
var frequency: ChoreFrequency
var assignedTo: FamilyMember
var isComplete: Bool
var dueDate: Date
}
Can I not use the Bindable property in the Picker?
Post not yet marked as solved
I have a few that is passed an item of type FamilyMember. Available in the view is a list of Chores. A chore has a member assigned to it. I want to filter the chores to the passed family member.
2 Structures and view code:
@Model
class Chore: Identifiable {
@Attribute(.unique) var id = UUID()
var name: String
var frequency: ChoreFrequency
var assignedTo: FamilyMember
var isComplete: Bool
var dueDate: Date
init(id: UUID = UUID(), name: String = "", frequency: ChoreFrequency = .daily, assignedTo: FamilyMember = FamilyMember(), isComplete: Bool = false, dueDate: Date = Date()) {
self.name = name
self.frequency = frequency
self.assignedTo = assignedTo
self.isComplete = isComplete
self.dueDate = dueDate
}
}
@Model
class FamilyMember: Identifiable {
@Attribute(.unique) var id: String { name }
var name: String
init(name: String = "Unassigned") {
self.name = name
}
}
struct MemberView: View {
@Bindable var member: FamilyMember
@Query private var chores: [Chore]
init(member: FamilyMember) {
self.member = member
let predicate = #Predicate<Chore> {
$0.assignedTo == member // <— Error occurs here!
}
_chores = Query(filter: predicate, sort: \.dueDate)
}
.
.
.
It's when creating the predicate that I'm running to an error of value conversion.
Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable<Chore>, FamilyMember>, PredicateExpressions.Value<FamilyMember>>' to closure result type 'any StandardPredicateExpression<Bool>'
What am I doing wrong?
Post not yet marked as solved
I have a SwiftUI view that is being passed a binding from a parent view. I would like to preview the subview, but can't. I tried .constant and a @Model object directly. Both ways crash the preview.
Any idea on how I can get this to work properly?
@Model
class FamilyMember: Identifiable {
@Attribute(.unique) var id: String { name }
var name = ""
init(name: String = "") {
self.name = name
}
}
struct MemberView: View {
@Bindable var member: FamilyMember
var body: some View {
Text(member.name)
}
}
#Preview {
MemberView(member: FamilyMember(name: "Family member"))
}
#Preview {
MemberView(member: .constant(FamilyMember(name: "Family member")))
}
Post not yet marked as solved
Is it possible to do Swift Data operations on a background processing event?
Post not yet marked as solved
Given a simple class:
final class Person {
name: String
age: Int
}
How can I get aggregated data such as average age, or count of people within specific ranges without retrieving all the data and doing the aggregates myself?
Post not yet marked as solved
When using a UIHostingController to host my SwiftUI content, I can't get the navigation title to start large and shift to inline as the user scrolls. Is this a known problem with using the UIHostingController?
var viewModel: DashboardViewModel!
lazy var contentView = UIHostingController(rootView: DashboardView(viewModel: viewModel))
override func viewDidLoad() {
super.viewDidLoad()
addChild(contentView)
view.addSubview(contentView.view)
setupConstraints()
navigationItem.title = "Test Title"
navigationItem.largeTitleDisplayMode = .automatic
}
The title in the navigation controller shows inline
Post not yet marked as solved
I have a sample app here: https://github.com/AaronBratcher/MoneyTrak where, if I install it onto a device from Xcode it runs fine. (Shows a list of accounts) However if I archive and add the .ipa onto the device the database isn't initialized properly and I don't understand why.
When the database is initially created in the AgileDB package, 2 tables should be created: __settings and __tableArrayColumns. If anyone can help, I would greatly appreciate it.
Post not yet marked as solved
I have these extensions to my NSObject, Codable class:
extension SavingsGoal: NSItemProviderWriting {
public static let typeIdentifier = "com.AaronLBratcher.SavingsGoal.Drag"
public static var writableTypeIdentifiersForItemProvider: [String] { [typeIdentifier] }
public typealias DragHandler = (Data?, Error?) -> Void
public func loadData(withTypeIdentifier typeIdentifier: String, forItemProviderCompletionHandler completionHandler: @escaping DragHandler) -> Progress? {
do {
print("^^^ encoding")
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
completionHandler(try encoder.encode(self), nil)
} catch {
completionHandler(nil, error)
}
return nil
}
}
extension SavingsGoal: NSItemProviderReading {
public static var readableTypeIdentifiersForItemProvider: [String] { [typeIdentifier] }
public static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> SavingsGoal {
print("^^^ decoding")
let decoder = JSONDecoder()
return try decoder.decode(SavingsGoal.self, from: data)
}
}
and these onDrag, onDrop method calls on my Views:
.onDrag { NSItemProvider(object: goal) }
.onDrop(of: [SavingsGoal.typeIdentifier], delegate: viewModel)
Visually the drag works on the simulator, showing a plus when it hits the target View, however only the delegate's performDrop call is made. The loadData and object methods are not called in the extensions and the DropInfo doesn't contain my object.
I have carefully checked and rechecked the code against available examples and cannot find what I did wrong.
Post not yet marked as solved
I have my animation for the rotation working beautifully, but the image is also moving vertically. Why?
struct SyncView: View {
@State var isSyncing = false
let animation: Animation = Animation.linear(duration: 2.0).repeatForever(autoreverses: false)
var body: some View {
VStack(spacing: 16) {
HStack {
VStack(alignment: .leading) {
Text("Linked Device's Name")
Text("Updating (Last update: Oct 1, 2022)")
.font(.callout)
.foregroundColor(.gray)
}
Spacer()
Text(Image(systemName: "arrow.triangle.2.circlepath"))
.foregroundStyle(Color.yellow)
.font(.title)
.rotationEffect(Angle.degrees(isSyncing ? 360 : 0))
.animation(animation, value: isSyncing)
}
}
.padding()
.onAppear {
isSyncing = true
}
}
}
Create new SwiftUI project
Replace ContentView with the code below
Tap either link.
Both views are pushed onto the nav stack
class ContentViewModel: ObservableObject {
@Published var navigationPath = NavigationPath()
}
struct ContentView: View {
@StateObject var viewModel = ContentViewModel()
var body: some View {
NavigationStack(path: $viewModel.navigationPath) {
Form {
Section {
VStack {
NavigationLink(value: 1) {
Text("Location")
}
NavigationLink(value: 2) {
Text("Category")
}
}
}
}.navigationDestination(for: Int.self) { route in
switch route {
case 1: Text("Location")
case 2: Text("Category")
default: Text("Unknown")
}
}.navigationTitle("Home")
}
}
}
What am I doing wrong? I would only expect the tapped item to be pushed into the stack.
Post not yet marked as solved
I have this in my code and it works, however if I have a long list it gets tiresome. Is there a better way of having an enum with associated values that also conforms to RawRepresentable?
public enum IconColor {
case regular
case error
case warning
case success
case custom(String)
public var value: Color {
return loadColor(self.rawValue)
}
}
extension IconColor: RawRepresentable {
public var rawValue: String {
switch self {
case .regular: return "icon_regular"
case .error: return "icon_error"
case .warning: return "icon_warning"
case .success: return "icon_success"
case .custom(let value): return value
}
}
public init(rawValue: String) {
switch rawValue {
case "icon_regular": self = .regular
case "icon_error": self = .error
case "icon_warning": self = .warning
case "icon_success": self = .success
default: self = .custom(rawValue)
}
}
}
Post not yet marked as solved
I have a custom EnvironmentVariable called analyticsData. On the button tap, I want to perform my button's action and then call a method to send this data.
struct PrimaryButton: View {
@Environment(\.analyticsData) private var analyticsData
private let title: String
private let action: (() -> Void)
init(_ title: String, action: @escaping (() -> Void)) {
self.title = title
self.action = action
}
var body: some View {
Button(action: handleTap) {
Text(title)
}
}
func handleTap() {
action()
// need updated value of analyticsData here!
AnalyticsProxy.shared.sendAnalytics(analyticsData)
}
}
At the point of use for this PrimaryButton, I would like to update my data dynamically. However, tapping between my 2 buttons, the data is 1 click behind.
button 1 tapped, analytics output: buttonTapped = ""
button 2 tapped, analytics output: buttonTapped = "B1"
button 1 tapped, analytics output: buttonTapped = "B2"
In my PrimaryButton handleTap method (above), I need to get the updated value of the environmentVariable before sending the analytics. Is this possible?
Point of use:
struct ContentView: View {
@State var buttonTapped = ""
var body: some View {
VStack(spacing: 64) {
PrimaryButton("Button 1") {
buttonTapped = "B1"
}.analytics(type: .event, name: "Button Tap", data: ["Button": buttonTapped])
PrimaryButton("Button 2") {
buttonTapped = "B2"
}.analytics(type: .event, name: "Button Tap", data: ["Button": buttonTapped])
}
}
}
On my M1 mac, using Xcode 13.3, I created a package and displayed the code coverage bar (Editor menu –> Code Coverage).
After running tests, there is no indication of code coverage at all in the source code.
How do I get code coverage when testing a package?
Post not yet marked as solved
I created a new Package with Xcode and incorporated a dependency, however when I try to use it, I get a "No such module" error.
How do I use the dependency in the Package sources? In a normal project, I can easily import and use AgileDB.
Here's the Package:
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "DBCore",
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "DBCore",
targets: ["DBCore"]),
],
dependencies: [
.package(url: "https://github.com/AaronBratcher/AgileDB", from: "6.4.0")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.target(
name: "DBCore",
dependencies: []),
.testTarget(
name: "DBCoreTests",
dependencies: ["DBCore"]),
]
)
Perhaps the AgileDB package as a dependency in the target? I tried copying that and it won't recognize it.