I have been looking for information on how to implement NSSpellChecker and NSTextCheckingController the last couple of days and have come up empty. Does anybody of some information using these two AppKit API's or even better an example on using them with an IBOutlet text field?
I understand Apple use to make available the source code for textEdit app? Does anybody know if this is still the case?
Thanks
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I have a test app with a tableView that has a comboBoxCell for one of the columns in Xcode 12:
The view controller code is as follows:
//
// ViewController.swift
// ComboBoxExample
//
// Copyright © 2016 yourCompany. All rights reserved.
//
import Cocoa
class ViewController: NSViewController, NSComboBoxCellDataSource {
var states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware",
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky",
"Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi",
"Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
"New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania",
"Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont",
"Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"]
@IBOutlet weak var itemComboCell: NSComboBoxCell!
override func viewDidLoad() {
super.viewDidLoad()
itemComboCell.usesDataSource = true
itemComboCell.dataSource = self
self.itemComboCell.completes = true
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
func numberOfItemsInComboBoxCell(in comboBoxCell: NSComboBoxCell) - Int {
// anArray is an Array variable containing the objects
return states.count
}
func comboBoxCell(_ comboBoxCell: NSComboBoxCell, objectValueForItemAt index: Int) - Any {
return (states[index])
}
}
When running the example I get the following error:
2021-03-05 15:16:29.940373-0600 ComboBoxExample[40515:1914724] *** Illegal NSComboBoxCell data source (ComboBoxExample.ViewController: 0x600000e501b0). Must implement numberOfItemsInComboBoxCell: and comboBoxCell:objectValueForItemAtIndex:
How do I resolve this?
Using a combo box after a selection I want to get control to take some actions based on the selection after press tab or return in the field. I have tried a few controls like the one below:
// textShouldEndEditing
func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) - Bool {
print(#function,control.tag)
But the above control only gets control if the field is edited. I want control once tab, an item selected or return is pressed while on the filed. How is this done?
I have the following code in a viewController:
extension InvoicesDetailController: NSTableViewDelegate {
fileprivate enum CellIdentifiers {
static let lineItemLabelCell = "lineItemLabelCell"
static let lineItemDescCell = "lineItemDescCell"
static let lineItemAmountCell = "lineItemAmountCell"
static let lineItemQtyCell = "lineItemQtyCell"
}
fileprivate enum fieldIdentifiers {
static let lineItemLabel = "lineItemLabel"
static let lineItemDesc = "lineItemDesc"
static let lineItemAmount = "lineItemAmount"
static let lineItemQty = "lineItemQty"
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) - NSView? {
let currentItem = invoiceItems[row]
var text: String = ""
var cellIdentifier: String = ""
let currentColumn = tableColumn?.identifier.rawValue
if currentColumn == fieldIdentifiers.lineItemLabel {
text = currentItem.lineItemLabel!
cellIdentifier = CellIdentifiers.lineItemLabelCell
}
if currentColumn == fieldIdentifiers.lineItemDesc {
text = currentItem.lineItemDesc!
cellIdentifier = CellIdentifiers.lineItemDescCell
}
if currentColumn == fieldIdentifiers.lineItemAmount {
text = currentItem.lineItemDesc!
cellIdentifier = CellIdentifiers.lineItemAmountCell
}
if currentColumn == fieldIdentifiers.lineItemQty {
text = currentItem.lineItemQty!
cellIdentifier = CellIdentifiers.lineItemQtyCell
}
if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: self) as? NSTableCellView {
print(cell.textField?.stringValue)
cell.textField?.stringValue = text
print(text, cell.textField?.stringValue)
return cell
}
return nil
}
I have used this code (similar code in other places and it works fine, however in this case the tableView Cells are not being populated. When I look at this code using debugger the line
if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: cellIdentifier), owner: self) as? NSTableCellView
always sets cell to nil? Since I don't see anything wrong with code I suspect there is an issue with the IB?
Any ideas how to fix or how to debug further?
How do you populate one column based on values of other column for a macOS app using Xcode 12 in a tableView?
The value of the first column comes from a comboBox which I get control by using the following code connected to the comboBox:
@IBAction func comboAction(_ sender: NSComboBox) {
print("Combo selected", sender.selectedTag(), sender.stringValue, sender.indexOfSelectedItem, sender.identifier as Any)
}
Then base on the value of the comboBox column within the comboAction function I want to populate column 2.
Can this be done? If so, how
Using Interface Builder with Xcode 11 I have created two windows, when I activate the second window it opens as a tab in the main window. How do I change this to start a second window instead of a tab?
I am developing an macOS Xcode 12 app that requires printing. I have a basic understanding how to implement printing, I understand that I need to create a subclass of NSview to get going. However, I was wondering how to go about designing the report? Is this done with interface builder like designing a window layout or is all done with code, ie supplying position (x,y), headings, font, graphics, font size.. etc. How is this done?
Also, does anybody have any tutorials on this? I have one example but it is very minimal print out, basically it prints a tableview with two columns. I got this from Coca Programming chapter 27, Big Nerd Ranch.
My environment is as follows:
Xcode 12, macOS BS developing a macOS app.
I have an IBOutlet from a IB window as
@IBOutlet weak var imageView: NSImageView!
So, I want to store imageView to a NSData object and then save the NSData object in my UserDefaults.
Once I saved the Image in my UserDefaults I need to be able to decode or retrieve the image for use in other parts of the app.
How is this done?
Also, I have seen some cautions about converting an Image to NSData object and retrieving. It seems the retrieved image may not be 100% as it was originally. Is this true and if so why?
Thanks
Anybody else having problems with app icon on Xcode 12 not showing up for a macOS app?
I connected Github to Xcode 13.2 (Monterey macOS) successfully, however I do not see any packages available when I select Github as the source.
I did download Xcode 13.2 from the developers website and it did fix some problems I was having with Xcode from the App Store but did make any difference to the issue above.
Anybody else have this issue with Xcode 13.2?
I have a macOS app which was built using Xcode 13 and storyboard. I want to add swiftCharts to the app. Can I add swiftCharts code to this app and not have to migrate the storyboard UI to swiftUI? How can this be done?
Thanks
How do you activate the Printer Panel using a toolbar printer Icon in a macOS app like you get when I select File -> Print (CMD-P)? This is in a tableView view based screen.
I have connected the first responder to "print:" thinking this might work but the printer Icon in the toolbar remains grayed-out. Also, tried connecting it to a @IBAction func but it still is grayed out.
I am using Xcode 13 and 14 beta
Is there a way with code I can in a general routine, which gets activated with CMD+P that shows the name of the window that was previously in focus? If so, how is this done?
class CustViewController: NSViewController {
@IBOutlet weak var tableView: NSTableView!
@IBOutlet weak var statusLabel: NSTextField!
fileprivate var selectedOptionFromMenu = ""
@objc var contacts:[Person] = []
@objc var backUpContacts:[Person] = []
@IBAction func printCustomers(_ sender: Any?) {
I would like to call the printCustomers function in the CustViewController from another class (NSWindowController). How is this coded in the NSWindowController class?
I tried the following:
let printAction = CustViewController.printCustomers(<#T##self: CustViewController##CustViewController#> )
but don't know how to code argument in this and this may be not be the way to do this?
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