To Clarify, the projects I am Looking for are from WWDC2023-10154. The video says download but no link, Is the link gone after initial play?
Thanks
"This is a code-along. During this session, I will be building an app with you. Hit pause now, and download the companion Xcode projects: an archive with the prepared starting point, and the finished one. Open the starter project, and go to the ContentView file"
Post
Replies
Boosts
Views
Activity
I ended up going a different route, I got it working like I wanted via SwifUI, I wanted to learn more about SwiftUI so this is a better way to go.
I tried a couple of things using a separate thread but still no luck. Below is my latest try? I must be missing something basic with this in seems to be very straightforward?
@IBAction func progressStart(_ sender: Any) {
// Start the progress animation
progressIndicator.startAnimation(self)
// Do some work here...
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
DispatchQueue.global(qos: .background).async {
var progress: Double = 0.0
for _ in 0..<100 {
// Update the progress value in a loop
progress += 1.0
DispatchQueue.main.async {
self.progressLabel.stringValue = String(progress)
self.progressIndicator.doubleValue = progress / 100.0
}
// Do some work here...
}
dispatchGroup.leave()
}
dispatchGroup.notify(queue: DispatchQueue.main) {
// Stop the progress animation
self.progressIndicator.stopAnimation(self)
}
}
}
I got it working. I did need to set Application can be killed immediately when user is shutting down or logging out" setting to NO to the target using the INFO tab but I had a coding error implementing applicationWillTerminate. So, here is how my app delegate looks now.
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillFinishLaunching(_ notification: Notification) {
}
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
// try! DatabaseManager.setup(for: NSApp)
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
func applicationWillTerminate(_ Notification: Notification) {
// Insert code here to tear down your application
getPrefs()
if paymePref.prefAutoBackup == "Yes" {
backupDataBase()
}
}
}
After reviewing some of the doc mentioned above, I did not see "sudden termination" but I added "Application can be killed immediately when user is shutting down or logging out" setting to NO to the target using the INFO tab but still applicationWillTerminate function is not being called.
Any ideas how to fix?
Seems to be still the case with Xcode 14.2. However I don't have a info.plist. Any ideas how to delete?
Thanks for the reply, I have been doing some research on secondaryLabelColor and can't find any examples as well as attempting to add it to my swiftUI view but not really sure how to code. Do you have any usage examples of this?
Also, how did you go about figuring out the legend color is driven by secondaryLabelColor.
Thanks
Thanks Claude, could not have done it without your help.
import Cocoa
class CustomTableCell: NSTableCellView {
@IBOutlet weak var userNameLabel: NSTextField!
@IBOutlet weak var roleLabel: NSTextField!
@IBOutlet var testTextView: NSTextView!
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
}
@IBAction func emailButton(_ sender: Any) {
// Email user
}
}
I was first trying to add a @IBAction for a scrollview and when I control drag the scrollview to the CustomTableCell file I could not create and @IBAction. It is like having a scrollview object inside a scrollable table view is not allowed. So, I was not able to create an action to get the contents of the scrollview in the ViewController code. Much less creating code to pass to the viewController the contents of the scrollView text entered.
I sent a offline demo project to illustrate what I am saying.
Thanks for your help on this.
Thanks again Claude, you have been very helpful. I think I am finally understanding to store data you need an instance of an object.
Thanks Claude,
follow up question.. How do I populate ChartSeriesData? I thought I could just add the following: However coding this way there is no append method.
extension ChartSeriesRow {
func addRow(chartRow: ChartSeriesData){
ChartSeriesRow.ChartSeriesData.chartEntry.append(contentsOf: chartRow)
}
}
The canvas needs to be in selectable view, This is set with the icon at the bottom left of the canvas. Once this is done the popup menu appears when you press CMD-Click.
You can get to this menu by CMD-Click in the code Not sure why you can not get this from CMD-Click on the canvas?
I am going thru some of the apple videos on swiftUI. [https://developer.apple.com/tutorials/swiftui?ref=madewithvuejs.com
)
Also, it is cmd left click not cmd-right click.
I figured this out. I had to create a date from the search string to use in the predicate>>>
Here is the working code:
@objc func invoiceSearch(sender:NSSearchField) {
let searchString = sender.stringValue
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYYMMdd"
var dateTemplate: String = "20000101"
var dateSearch: String = ""
var dateEndSearch: String = ""
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
var predicate:NSPredicate = NSPredicate()
if searchString.isEmpty {
invoices = self.backUpInvoices
}
else{ // search field contains data
if searchString.isContainsLetters == false { // If false must be a date search (Numerics or -)
dateSearch = dateTemplate // Code to handle a begin and end date in
if searchString.count < 9 { // the format YYYYMMDD-YYYYMMDD initially end date is
dateSearch.removeFirst(searchString.count) // set to current date
dateSearch = searchString + dateSearch
searchBeginDate = dateFormatter.date(from: dateSearch)!
}
else {
if searchString.count > 9 {
dateSearch.removeFirst(searchString.count-9)
dateEndSearch = searchString
dateEndSearch.removeFirst(9)
dateSearch = dateEndSearch + dateSearch
searchEndDate = dateFormatter.date(from: dateSearch)!
}
}
}
if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "All" {
predicate = NSPredicate(format: "invoiceNumber contains %@ OR invoiceCustName contains %@ OR invoiceStatus contains %@ OR invoiceDateCreated >= %@ AND invoiceDateCreated < %@",searchString,searchString,searchString,searchBeginDate as NSDate, searchEndDate as NSDate)
}
else if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "invoice Number" {
predicate = NSPredicate(format: "invoiceNumber contains %@",searchString)
}
else if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "invoice Customer"{
predicate = NSPredicate(format: "invoiceCustName contains %@",searchString)
}
else if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "invoice Status"{
predicate = NSPredicate(format: "invoiceStatus contains %@",searchString)
}
else if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "Invoice Date"{
predicate = NSPredicate(format: "invoiceDateCreated >= %@ AND invoiceDateCreated < %@", searchBeginDate as NSDate, searchEndDate as NSDate)
}
invoices = (self.backUpInvoices as NSArray).filtered(using: predicate) as! [Invoice]
}