I'm developing an app for my watch and have a list of different classes (referred to as 'courses' to avoid confusion) that I take in school, eg:
struct Course {
let name: String
let icon: String
let room: String
let colour: String
let listName: String
let listIcon: String
init(name: String, icon: String, room: String? = nil, colour: String,
listName: String? = nil, listIcon: String? = nil)
{
self.name = name
self.icon = icon
self.room = room ?? "None"
self.colour = colour
self.listName = listName ?? name
self.listIcon = listIcon ?? icon+".circle.fill"
}
}
// here's a few of my Course variables (there are lots more I've excluded)
let MathsCourse = Course(name: "Maths", icon: "number", room: "FT5", colour: "Rose")
let English6 = Course(name: "English", icon: "book.closed", room: "BT6", colour: "Lemon")
let LunchPeriod = Course(name: "Lunch", icon: "fork.knife", room: "food", colour: "White")
and I have designed a 'list view' of all the courses I have on whatever day it is. I used to define a different View for every course I defined but I merged the list data with the overall Course and replaced the Views with something that I should be able to call repeatedly and pass in a course to use, but unfortunately it's not working. (yes, I'm making a timetable app)
This is the template for a 'list view' for a class:
struct courseListView: View {
var localcourse: Course
var localtime: String
var body: some View {
HStack{
Image(systemName: localcourse.listIcon)
.foregroundColor(Color(localcourse.colour))
.padding(.leading, 5)
Text(localcourse.name)
.bold()
Spacer()
Text(localtime)
Text(roomOrBlank(course: localcourse)).bold().padding(.trailing, 5)
}
.padding(.bottom, 1)
.background(currentCourse.name==localcourse.name ? Color(localcourse.colour).colorInvert(): nil)
}
}
Then I should be able to programmatically work out what courses I have that day (I haven't scripted that bit yet), and compose a view containing all the courses:
struct ListView: View {
var body: some View {
ScrollView {
VStack(alignment: .leading) {
courseListView(localcourse: MathsCourse, localtime: "10:00")
// ^^^ note above line; I'll come back to this
// the idea is I can repeat that for a bunch of courses:
courseListView(localcourse: English6, localtime: "11:00")
courseListView(localcourse: LunchPeriod, localtime: "12:00")
}
}
}
}
Then be able to call all that in my @main:
@main
struct Timetaber_Watch_AppApp: App {
var body: some Scene {
WindowGroup {
TabView{
HomeView()
ListView()
SettingsView()
}
.tabViewStyle(.carousel)
.onAppear() {
log()
}
}
}
}
Unfortunately, each time I try to get a list view for a course,
// if you need a reminder:
courseListView(localcourse: MathsCourse, localtime: "10:00")
...even only calling it once causes my entire app to crash.
Here's an excerpt from the crash report:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000180210194
Termination Reason: SIGNAL 5 Trace/BPT trap: 5
Terminating Process: exc handler [14932]
Triggered by Thread: 0
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libdispatch.dylib 0x180210194 _dispatch_once_wait.cold.1 + 28
1 libdispatch.dylib 0x1801db4f4 _dispatch_once_wait + 184
2 ??? 0x3400200d0 ???
3 ??? 0x340020198 ???
4 ...
So...
Anyone know what's happening?
Post
Replies
Boosts
Views
Activity
I'm trying to make a timetable app for my Apple Watch, and it has all actually been going pretty smoothly until this random error started showing up when I try to build my application. Here's a code snippet:
// all on top level:
class globalStorage {
static let shared = globalStorage() // line 27
@State @AppStorage(runningKey) var termRunningGB = false
@State @AppStorage(ghostWeekKey) var ghostWeekGB = false
@State @AppStorage(startDateKey) var startDateGB = Date.now
var currentCourse: Course = getCurrentClass(date: .now)
}
let storage = globalStorage.shared // << ERRORING HERE (line
// ...
@main
struct myApp: App { /* ... */ }
Can anybody tell me what is happening? (And, of course, how to fix it?)
Furthermore, upon removing the offending line (let storage = globalStorage.shared) (and replacing all callers of said variable with 'globalStorage.shared' to bypass the variable) the error has decided to settle on line 27, where i define the 'shared' thing in the class.
[ I just went back to try more solutions, I have resolved it but forgot to give my solution here. Now I've forgotten how I fixed it. I do know that I moved currentCourse out of the class, that most likely was it I think.]
All of this code is on GitHub: https://github.com/the-trumpeter/Timetaber-for-iWatch