Environment is macOS Monterey Xcode 13.
Is there a way to change the behavior of a macOS NSTableView to have the row height change based on the contents of a column. As an example when populating the column data and the width of the content exceeds the width of the column to have the content wrap to an additional line, which of course the row height would have to change then as well.
If so, how can this be done?
Thanks
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
I am using the code below to learn more about drawing but I am getting an ambiguous error on the line not sure how to resolve this. Please advise how to code this.
Thanks
let context = NSGraphicsContext.current()?.cgContext
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
** let context = NSGraphicsContext.current()?.cgContext**
let length = CGPoint(x: 100, y: 100)
let p1 = CGPoint(x: 200, y: 200)
let shape = "square"
context!.beginPath()
context!.move(to: p1)
if shape == "line" {
let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
context!.addLine(to: pointEnd)
} else if shape == "square" {
let p2 = CGPoint(x: p1.x + length.x, y: p1.y)
let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
let p4 = CGPoint(x: p1.x, y: p1.y + length.y)
context!.addLine(to: p2)
context!.addLine(to: p3)
context!.addLine(to: p4)
context!.addLine(to: p1)
}
context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0)
context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1)
context!.setLineWidth(2.0)
context!.strokePath()
let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0)
let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0)
let rect = CGRect(x: 200, y: 200, width: 30, height: 130)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle, NSAttributedString.Key.foregroundColor: textColor, NSAttributedString.Key.backgroundColor: textColorB, NSAttributedString.Key.font:NSFont.init(name: "HelveticaNeue-Thin", size: 14)]
let q: NSString = "hello, world"
let center = CGPoint(x: 0, y: 0)
q.draw(at: center, withAttributes: attr as [NSAttributedString.Key : Any])
}
}
I would like customize the nstableview alternate row color as light blue instead og light gray.
How is this done?
thanks
I have the test code below which draws a box with some text in it. I would like to add an image to the drawing. The function getCompanyLogo returns an NSImage and I would like to then add this image to the drawing. I have read apple's archive doc at the Drawing with COCOA but do not see how to complete this.
How is this done?
Thanks
import Cocoa
@IBDesignable class invoiceSectionTop: NSView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
let context = NSGraphicsContext.current?.cgContext
let length = CGPoint(x: 200, y: 50)
let p1 = CGPoint(x: 0, y: 50)
let shape = "square"
context!.beginPath()
context!.move(to: p1)
if shape == "line" {
let pointEnd = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
context!.addLine(to: pointEnd)
} else if shape == "square" {
let p2 = CGPoint(x: p1.x + length.x, y: p1.y)
let p3 = CGPoint(x: p1.x + length.x, y: p1.y + length.y)
let p4 = CGPoint(x: p1.x, y: p1.y + length.y)
context!.addLine(to: p2)
context!.addLine(to: p3)
context!.addLine(to: p4)
context!.addLine(to: p1)
}
context!.setStrokeColor(red: 1, green: 1, blue: 1, alpha: 1.0)
context!.setFillColor(red: 0, green: 1, blue: 0, alpha: 1)
context!.setLineWidth(2.0)
context!.strokePath()
let image = getCompanyLogo() // getCompanyLogo returns a NSImage object
// NSGraphicsContext.current?.NSIm.draw(cgimage!, in: dirtyRect)
let textColor = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1.0)
let textColorB = NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 0.0)
let rect = CGRect(x: 200, y: 200, width: 30, height: 130)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attr = [NSAttributedString.Key.paragraphStyle: paragraphStyle, NSAttributedString.Key.foregroundColor: textColor, NSAttributedString.Key.backgroundColor: textColorB, NSAttributedString.Key.font:NSFont.init(name: "HelveticaNeue-Thin", size: 14)]
let q: NSString = "hello, world"
let center = CGPoint(x: 0, y: 50)
q.draw(at: center, withAttributes: attr as [NSAttributedString.Key : Any])
}
}
I have a date column in a macOS NSTableView column in YYYY-MM-DD format and when using the code below the sort does not sort way I want. When sorting ascending. It has the year correct but the month is in reverse order. See image below. How can I fix this?
func sortInvoices(invoiceColumn: String, ascending: Bool) {
enum SortOrder {
static let Date = "invoiceDateCreated"
static let Number = "invoicenumber"
static let Customer = "invoicecustomer"
static let Status = "invoicestatus"
}
switch invoiceColumn {
case SortOrder.Date:
invoices.sort { (p1, p2) -> Bool in
guard let id1 = p1.invoiceDateBilled, let id2 = p2.invoiceDateBilled else { return true }
if ascending {
return id1 < id2
} else {
return id2 < id1
}
}
I have the following code to search a tableView. The contains format works fine for string arguments however can't seem to find the correct format to work with date arguments.
@objc func invoiceSearch(sender:NSSearchField) {
// print ("\(#function): \(sender.stringValue)")
let searchString = sender.stringValue
var predicate:NSPredicate = NSPredicate()
if searchString.isEmpty {
invoices = self.backUpInvoices
}
else{ // search field contains data
if (invoiceSearchField.cell as? NSSearchFieldCell)?.placeholderString == "All" {
predicate = NSPredicate(format: "invoiceNumber contains %@ OR invoiceCustName contains %@ OR invoiceStatus contains %@ OR invoiceDateCreated >= %@",searchString,searchString,searchString,searchString)
}
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 >= %@", searchString as CVarArg)
}
invoices = (self.backUpInvoices as NSArray).filtered(using: predicate) as! [Invoice]
}
invoiceCount = "Found \(items.count ) Invoices"
invoiceStatusLabel.stringValue = invoiceCount
self.tableView.reloadData()
}
InvoiceDateCreated is defined by the following within a NSObject class:
@objc var invoiceDateCreated: Date? = Date()
The error I get when trying to search on date is
2022-09-26 09:14:36.638553-0500 CashToMe[9107:6838576] [General] -[NSTaggedPointerString objCType]: unrecognized selector sent to instance
I have read through the following documentation
Apple Doc for NSPredicate
How can I fix this. Also, if there is a better/newer way to code this I am open to changing the code.
Thanks
Environment: Xcode 14.1 beta 3 on macOS Ventura Beta 9.
No longer need this, I found example of this.
struct LocationsChart: View {
var body: some View {
Chart {
ForEach(seriesData, id: \.city) { series in
ForEach(series.data, id: \.weekday) {
BarMark(
x: .value("Weekday", $0.weekday, unit: .day),
y: .value("Sales", $0.sales)
)
}
.foregroundStyle(by: .value("City", series.city))
.position(by: .value("City", series.city))
}
}
}
let seriesData = [
(
city: "Cupertino", data: [
(weekday: date(year: 2022, month: 5, day: 2), sales: 54),
(weekday: date(year: 2022, month: 5, day: 3), sales: 42),
(weekday: date(year: 2022, month: 5, day: 4), sales: 88),
(weekday: date(year: 2022, month: 5, day: 5), sales: 49),
(weekday: date(year: 2022, month: 5, day: 6), sales: 42),
(weekday: date(year: 2022, month: 5, day: 7), sales: 125),
(weekday: date(year: 2022, month: 5, day: 8), sales: 67)
]
),
(
city: "San Francisco", data: [
(weekday: date(year: 2022, month: 5, day: 2), sales: 81),
(weekday: date(year: 2022, month: 5, day: 3), sales: 90),
(weekday: date(year: 2022, month: 5, day: 4), sales: 52),
(weekday: date(year: 2022, month: 5, day: 5), sales: 72),
(weekday: date(year: 2022, month: 5, day: 6), sales: 84),
(weekday: date(year: 2022, month: 5, day: 7), sales: 84),
(weekday: date(year: 2022, month: 5, day: 8), sales: 137)
]
)
]
}
func date(year: Int, month: Int, day: Int = 1) -> Date {
Calendar.current.date(from: DateComponents(year: year, month: month, day: day)) ?? Date()
}
Environment : macOS Ventura Xcode beta 14.1:
I have the following chart I was using to learn about SwifUI Charts:
I wanted to have different scales on the leading and trailing yaxis as well as have the first 3 bars to use leading scale and the last two bars use the trailing scale.
Can this be done? If so, how?
Thanks
I don't see the structured editing popover when I command right click on an IOS SwiftUI project when I create a new project with just "Hello World" like I see in Xcode 13. Am I missing some thing or is this a bug?
Thanks
From the class below how do I initialize chartEntry for the structure array? As it is below chartEntry is outside scope of init?
class ChartSeriesRow: ObservableObject {
var id = UUID()
var chartCategory: String
struct chartSeriesData{
var chartEntry: [ChartData]
}
struct ChartData: Codable, Identifiable, Hashable {
var id = UUID()
let chartMonth: String
let chartSales: String
}
init() {
chartCategory = ""
chartEntry = chartSeriesData: [ChartData.chartMonth: "01", ChartData.chartSales: "10.0"]
}
}
I have the following code:
class ChartSeriesRow: ObservableObject {
var id = UUID()
var chartCategory: String
struct ChartSeriesData {
var chartEntry: [ChartData]
}
var chartSeries : ChartSeriesData
struct ChartData: Codable, Identifiable, Hashable {
var id = UUID()
let chartMonth: String
let chartSales: String
}
init() {
chartCategory = ""
chartSeries = ChartSeriesData(chartEntry: [ChartData(chartMonth: "01", chartSales: "10.0") ] )
}
}
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)
}
}
I have a macOS tableview I have a textfield as a column along with an IBAction code to capture the data from this field. I wanted to add continuous spell check for this column .
So, I decided to change the column from a TextField to a ScrollView to take advantage of the continuous spell check. Using Xcode 14 I changed the Cell to a custom Cell. The custom cell has a scrollview object as the object because I want to take advantage of the built in continuous spell checking instead of using a textfield. All is well with this implementation until I tried to add a IBAction code for when I enter text in the scrollview/textView field.
There does not seem to be a way to capture the text? Am I trying to do something that can't be done or is there a way to add continuous spell check to a textField?
For a macOS app using Xcode 14.1. I have a bar chart with two bars for each interval. See screen chart below. I want to change the "Invoice" and Payments" text
I can't seem to find a modifier for the Legend text. How do you change the text color for SwiftUI Chart's legend text?
I want to put some code to be run when my app terminates but the following:
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
print("Termination Code")
}
in the AppDelegate class is not called, any ideas how to fix this issue.
I saw this posts https://developer.apple.com/forums/thread/126418 but I do not have an info.plist. I think the info.plist is not longer needed.
The following doc does not have much to say about this??
https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428522-applicationwillterminate
The find and replace in project is not working for me in Xcode 14.2 on Ventura 13.2. When I enter the find text as well as the replace text the "Replace" and "Replace All" buttons remained grayed out.
Is this a bug with Xcode or am I missing something?
Please advise.