Posts

Post marked as solved
1 Replies
737 Views
took a bit of experimenting... import AVKit    //  macOS & iOS class ViewController_myShow: NSViewController {          @IBOutlet var myMOV: AVPlayerView! 10.          override func viewDidLoad() {         super.viewDidLoad()                  let playerView = AVPlayerView() 20. 21.         playerView.translatesAutoresizingMaskIntoConstraints = false 22. 23.         view.addSubview(playerView) 24. 25. 26. 27.         playerView.leadingAnchor.constraint  (equalTo: view.safeAreaLayoutGuide.leadingAnchor ).isActive = true 28. 29.         playerView.trailingAnchor.constraint (equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true 30. 31.         playerView.topAnchor.constraint      (equalTo: view.safeAreaLayoutGuide.topAnchor     ).isActive = true 32. 33.         playerView.bottomAnchor.constraint   (equalTo: view.safeAreaLayoutGuide.bottomAnchor  ).isActive = true 34. 35. 36. 37.         playerView.controlsStyle = .floating 38. 39.         playerView.showsFrameSteppingButtons   = true 40. 41.         playerView.showsFullScreenToggleButton = true 42. 43.          44. 45.         guard let path = Bundle.main.url(forResource: "myMovie", withExtension: "mov") else { return } 46. 47. 48. 49.         let player = AVPlayer(url: path) 50. 51.             playerView.player = player 52. 53.         playerView.player?.play()   54. 55.     } 56. 57. } The StoryBoard:AttributesInspector:AVPlayerView settings don't work for me... exactly. I had to set StoryBoard:AttributesInspector:AVPlayerView:ControlsStyle:none then include lines 37-41 in my code. The default is StoryBoard:AttributesInspector:AVPlayerView:ControlsStyle:inline which appears on screen but does nothing, i.e., no control. Line 21 is also required to be false. The .mov file can be File:AddFilesTo 'd or copied to Assets.xcassets see also: Developer Forum: "can't get extremely simple macOS video player to work..." https://developer.apple.com/documentation/avfoundation/media_playback_and_selection/creating_a_basic_video_player_macos 			
Posted Last updated
.
Post marked as solved
5 Replies
1.6k Views
I have searched but cannot find an example of this. In my example I use playground to nest for-loops in a function called from within DispatchQueue. I find many roadblocks: //import AppKit // playground doesn't recognize AppKit?! import Dispatch import Foundation var comboCount:NSKeyValueObservation? //class viewContr: NSViewController { @IBOutlet weak var progressBar: NSProgressIndicator! // deinit { comboCount?.invalidate() } @IBAction func calcStuff() { DispatchQueue.global(qos: .userInitiated).async { let combos = possibleCombos() DispatchQueue.main.async { for word in combos { word.print0b8() } } } } //} func possibleCombos() -> [Int8] { var combos = [Int8]() for a in [0, 1] { for b in [0, 1] { for c in [0, 1] { for d in [0, 1] { combos.append(Int8(d | (c << 1) | (b << 2) | (a << 3)) ) comboCount = combos.count/16 as! NSKeyValueObservation // known total combos = 16 // How do I pass combos.count out to a progress bar? } } } } return combos } extension Int8 {func print0b8() {print("0b" + pad(string: String(self, radix: 2), toSize: 4))}} func pad(string : String, toSize: Int) -> String {var padded = string;for _ in 0..<(toSize - string.count) {padded = "0" + padded};return padded} Removing the @IB obstacles and the attempted declaration of a ViewController does produce output, but can't be used with a progress bar, e.g., import Dispatch import Foundation DispatchQueue.global(qos: .userInitiated).async { let combos = possibleCombos() DispatchQueue.main.async { for word in combos { word.print0b8() } } } func possibleCombos() -> [Int8] { var combos = [Int8]() for a in [0, 1] { for b in [0, 1] { for c in [0, 1] { for d in [0, 1] { combos.append(Int8(d | (c << 1) | (b << 2) | (a << 3)) ) // known total combos = 16 // How do I pass combos.count out to a progress bar? } } } } return combos } extension Int8 {func print0b8() {print("0b" + pad(string: String(self, radix: 2), toSize: 4))}} func pad(string : String, toSize: Int) -> String {var padded = string;for _ in 0..<(toSize - string.count) {padded = "0" + padded};return padded} In my actual App, i.e., not this playground, I have a ProgressBar in my storyboard and an IBoutlet declared in my view controller. I just can't find how to pass a value out of "possibleCombos()" and into the NSProgressIndicator. What I have read suggests a delegate but reading about delegates hasn't helped. I need an example. Thanks.
Posted Last updated
.
Post marked as solved
7 Replies
902 Views
Code to draw a graph of data. Each abscissa has an ordinate range to be displayed as a line segment. All data, i.e., scaled points are verified to be within the declared analysisView.bounds. strokeColors are verified within the range 0..1 BTW, no I don't need animation for this static data, but CALayer seemed to require more coding, and I found fewer code examples for it. The code below has two problems: 1) it doesn't draw into the window the weird behavior of min/max The first is why I am posting. What am I missing? import AppKit class AnalysisViewController: NSViewController { @IBOutlet var analysisView: NSView! var ranges = [ClosedRange<Double>]() var ordinateMinimum = CGFloat() var ordinateMaximum = CGFloat() var ordinateScale = CGFloat() let abscissaMinimum:CGFloat = 1 let abscissaMaximum:CGFloat = 92 let abscissaScale :CGFloat = 800/92 let shapeLayer = CAShapeLayer() var points = [CGPoint]() // created just to verify (in debugger area) that points are within analysisView.bounds func genrateGraph() { // ranges.append(0...0) // inexplicably FAILS! @ ordinateMinimum/ordinateMaximum if replaces "if N == 1" below // ranges.append(0.1...0.1) // non-zero range does not fail but becomes the min or max, therefore, not useful for N in 1...92 { if let element = loadFromJSON(N) { if N == 1 { ranges.append( element.someFunction() ) } // ranges[0] is an unused placeholder // if N == 1 { ranges.append(0...0) } // inexplicably FAILS! @ ordinateMinimum/ordinateMaximum if replacing above line ranges.append( element.someFunction() ) } else { ranges.append(0...0) } // some elements have no range data } ordinateMinimum = CGFloat(ranges.min(by: {$0 != 0...0 && $1 != 0...0 && $0.lowerBound < $1.lowerBound})!.lowerBound) ordinateMaximum = CGFloat(ranges.max(by: {$0 != 0...0 && $1 != 0...0 && $0.upperBound < $1.upperBound})!.upperBound) ordinateScale = analysisView.frame.height/(ordinateMaximum - ordinateMinimum) for range in 1..<ranges.count { shapeLayer.addSublayer(CALayer()) // sublayer each abscissa range so that .strokeColor can be assigned to each // shapeLayer.frame = CGRect(x: 0, y: 0, width: analysisView.frame.width, height: analysisView.frame.height) // might be unneccessary let path = CGMutablePath() // a new path for every sublayer, i.e., range that is displayed as line segment points.append(CGPoint(x: CGFloat(range)*abscissaScale, y: CGFloat(ranges[range].lowerBound)*ordinateScale)) path.move(to: points.last! ) points.append(CGPoint(x: CGFloat(range)*abscissaScale, y: CGFloat(ranges[range].upperBound)*ordinateScale)) path.addLine(to: points.last! ) path.closeSubpath() shapeLayer.path = path // shapeLayer.strokeColor = CGColor.white let r:CGFloat = 1.0/CGFloat(range) let g:CGFloat = 0.3/CGFloat(range) let b:CGFloat = 0.7/CGFloat(range) // print("range: \(range)\tr: \(r)\tg: \(g)\tb: \(b)") // just to verify 0...1 values shapeLayer.strokeColor = CGColor(srgbRed: r, green: g, blue: b, alpha: 1.0) } } override func viewDidLoad() { super.viewDidLoad() view.wantsLayer = true // one of these (view or analysisView) must be unneccessary view.frame = CGRect(x: 0, y: 0, width: 840, height: 640) analysisView.wantsLayer = true analysisView.frame = CGRect(x: 0, y: 0, width: 840, height: 640) genrateGraph() } }
Posted Last updated
.
Post marked as Apple Recommended
6.3k Views
How do I access a returned value from a Process(), in this case 'which'... var sips_path : String? //MARK: locate sips on local machine let which_sips = Process() which_sips.executableURL = URL(fileURLWithPath: "which") which_sips.arguments = ["sips"] do { sips_path = try which_sips.run() } catch let error as NSError { sips_path = "/usr/bin/sips"; print("Failed to execute which_sips", error) }line 8. gets compiler error "Cannot assign value of type '()' to type 'String?'" I believe, but cannot prove, 'which' returns a string. .run() throws and throws are for errors only, right? So where is the result of calling which?It seems I should use a closure to use $0 but it's already in one...line 9. intends to assign a default path.
Posted Last updated
.
Post not yet marked as solved
13 Replies
6.2k Views
I have developed an app using SceneKit since Swift came out. Now SwiftUI is out and uses structs rather than classes. SceneKit is a cascade of classes. As a newbie, I am concerned that my code might be obsolete through depreciations soon after publication and I'd rather get ahead of the issues now. So, is SceneKit long-term viable? My first attempts at converting my custom classes to structs seems impossible without Apple leading the way. If I understand correctly, I can make a struct whose only member is an instance of a class, but the benefits of the struct, e.g., minimal memory, processing time, etc., are lost.
Posted Last updated
.
Post not yet marked as solved
8 Replies
1.1k Views
I launch the following runSavePanel() from, e.g., @IBAction func JSONall(_ sender: NSButton) {         if !nsPanelActivatedThisSessionForSandbox {         nsPanelActivatedThisSessionForSandbox = true runSavePanel() } ... } where var nsPanelActivatedThisSessionForSandbox = false is declared as a global in the AppDelegate.swift file and is intended to prevent repeated user prompting as the program creates many files but needs sandbox acknowledgment at least once. The problem behavior is that upon clicking the OK button, the app merrily creates the files in the chosen directory but the modal window stays open until the app is done creating files (around ten minutes). Here is my runSavePanel() and its (empty) delegate:     func runSavePanel() {         let defaults = UserDefaults.standard         let savePanel = NSSavePanel()         savePanel.canCreateDirectories     = true         savePanel.canSelectHiddenExtension = false         savePanel.showsHiddenFiles         = false         //        savePanel.allowedFileTypes         = ["JSON", "csv"]                            //  deprecated         savePanel.directoryURL             = defaults.url(forKey: "fileDirectoryPref")         let delegate = OpenSavePanelDelegate()      //  cannot consolidate with next line         savePanel.delegate = delegate         let result = savePanel.runModal()         if result == NSApplication.ModalResponse.OK {             if savePanel.url != nil {                 do {                     try savePanel.delegate!.panel!(savePanel, validate: savePanel.url!)                     defaults.set(savePanel.url, forKey: "fileDirectoryPref")                     //        defaults.set(savePanel.url, forKey: "NSNavLastRootDirectory")   //  does not write                 } catch {                     print("\(result) ViewController Structures.swift:739 runSavePanel()")                 }             }         }     }          class OpenSavePanelDelegate: NSObject, NSOpenSavePanelDelegate {         func panel(_ sender: Any, validate url: URL) throws {             /*  In Swift, this method returns Void and is marked with the throws keyword to indicate that it throws an error in cases of failure.              You call this method in a try expression and handle any errors in the catch clauses of a do statement, as described in Error Handling in The Swift Programming Language and About Imported Cocoa Error Parameters.              */ //            throw CustomError.InvalidSelection         }     }      //    enum CustomError: LocalizedError { //        case InvalidSelection // //        var errorDescription: String? { //            get { //                return "\(CustomError.InvalidSelection)" //            } //        } //    } Idk how to stop the double spacing when pasting my code. Sorry. The delegate is a requirement but I don't know how to configure it. The app doesn't generate errors... or at least it allows the desired output. Is the delegate supposed to terminate the modal window somehow?
Posted Last updated
.
Post marked as solved
2 Replies
471 Views
My SceneView hides part of my NSStackView's TextFields. I don't see anything in the inspector for the z dimension. How can I ensure the StackView is on top, i.e., wholly visible? I don't want to shove views around to "fit them in". They must overlap. Indeed, I may wish to have all TextFields, etc. overlay the SceneView in the future, but that's a different subject. I know this would be easy in SwiftUI, but...
Posted Last updated
.
Post marked as solved
2 Replies
532 Views
As stated in the title, I want to hide or show a StackView when a menu item is selected, which in turn changes a global variable. How do I access the identity or handle of the StackView?
Posted Last updated
.
Post marked as solved
6 Replies
1.6k Views
I have modified Apple's Tutorial "CPU-GPU-Synchronization.xcodeproj" to suit my needs but cannot see how to launch it, e.g., as a sheet, from a Button inside a SwiftUI App. I found this: "developer.apple.com/forums/thread/119112" which establishes the Coordinater wrapper, device and CommandQueue, etc., but how do I "replace?" those already established in ObjC code? For example, ObjC does not recognize SwiftUI struct's and I can't @objc preface a SwiftUI struct as I can a SwiftUI class(ref. the above thread). Alternatively, is this the best venue to ask Apple to update/integrate their tutorials? Thanks.
Posted Last updated
.
Post marked as solved
1 Replies
351 Views
My ContentView has an @EnvironmentObject and a few @State var's. The State vars are for use in TextFields, one can use a Picker or manual entry, and works fine. The other State var is to have its value set when the user hits a Button whose action executes a host of functions that changes the values of over twenty @Published vars monitored/updated by the @EnvironmentObject vis-a-vis Combine. This TexField must also be manually set/edited when desired. Within that same Button(action:{}) the next line of code attempts to set a State var to the value of the Published EnvironmentObject that had been changed by all those functions in the previous line. The problem is: the EnvironmentObject is not updated by the time this line of code is executed. Such that the Button must be pressed twice for the result to change the TextField. I have scoured the web and did not find, or did not understand, what is amiss. I have successfully used .id(UUID()) on Views to ensure updates, but this issue is within a Button/action and I wouldn't know how to implement it here as TextField is a struct, and I can't implement a View.id(UUID()) inside the Button. So far as I know. Thanks.
Posted Last updated
.
Post marked as solved
2 Replies
1.6k Views
I am porting a functioning Swift App to SwiftUI with the ambitious intention of Multiple platform coding, so the project was created as such. I've worked out every issue except as the title suggests. My pertinent code: import SwiftUI import SceneKit struct ContentView: View { var scene : SCNScene = SCNScene = { () -> SCNScene in          //  DO NOT REPLACE OR MODIFY THE FIRST AND LAST LINES OF THIS VAR DECLARATION, e.g., "var scene:SCNScene{ ... }"  else initScene(newScene) FAILS to create children! let newScene = SCNScene() initScene(newScene)                            //  adds ChildNodes named: "precession" & "nuclearSpin" let newCamera = SCNNode() newCamera.position = SCNVector3(x: 0, y: 0 ,z: 40) newCamera.name = "cameraNode" newCamera.camera = SCNCamera() newScene.rootNode.addChildNode(newCamera) 10. newScene.fogDensityExponent = 0.0 return newScene }() @EnvironmentObject var structures:Structures @State private var Ncv = Int() @State private var indexMomentcv = Int() var body: some View { ZStack{ 20. SceneView( 21. scene: scene, 22. pointOfView: scene.rootNode.childNode(withName: "cameraNode", recursively: false), 23. options: [.allowsCameraControl, .autoenablesDefaultLighting, .temporalAntialiasingEnabled] 24. ).colorInvert() 25.             VStack(alignment: .trailing){ 26.                 Group{ 27.                     HStack{ 28.                         VStack{ // ... and so on 29. I have verified the existence of all nodes created for the scene, i.e., the objects to be seen, using these useful functions: func printChildNodeHierarchy(node: SCNNode) { node.enumerateChildNodes( { (anyNode,false) -> Void in return print( anyNode ) } ) }  //  SUPER handy func printChildNodeTransform(node: SCNNode) { node.enumerateChildNodes( { (anyNode,false) -> Void in return print( anyNode.name!,"\t", anyNode.simdTransform,"\t",anyNode.scale ) } ) } func printChildNodeAction   (node: SCNNode) { node.enumerateChildNodes( { (anyNode,false) -> Void in return print( anyNode.name!,"\t", anyNode.hasActions,"\t",anyNode.actionKeys ) } ) } ...which print in the debugging area. I have verified the materials assignments to the elements of those nodes. So, everything is in place as in the functioning Swift/macOS App but I just don't see the objects. What I've tried: Since I run in DarkMode theme I have cycled through the combinations of Dark/Light and with/without line 24's .colorInvert() and swapping ZStack with HStack. Some combo's do wash-out, but still no objects. I zero'd out the fog thinking it might be too foggy. Not. I've created a scene.scn file as a resource, applied the above attributes to it, reference it with scene = SCNScene(named: scene.scn"), but get the same non-result. Idk if some checkbox is errant in the build/target etc. area. Wouldn't know if it was. I'm not a professional programmer. Any thoughts are appreciated. I've been stuck for days. oh yeah: as of this posting I am up to date on all Apple software, running 2018 MacMini/Intel/SSD
Posted Last updated
.
Post marked as solved
5 Replies
1.2k Views
I've written an Switft/macOS App that creates directories deep within its own hierarchy. (no problem). Porting to SwiftUI means these directories and files should go(default) to ~/Documents. Since my Documents dir is (chmod -r 700) the ported app cannot write due to permissions. Which begs he question: what ID does the running app use? I found: https://developer.apple.com/forums/thread/82503?answerId=249036022#249036022 and it did change Xcode's : kMDItemFSOwnerGroupID                   = 20 kMDItemFSOwnerUserID                    = 502 but it still does not write as though it has my permissions. Aside from changing my ~/Documents dir permissions, how do I make my App (build/run within Xcode) as me so it can write?
Posted Last updated
.
Post not yet marked as solved
0 Replies
267 Views
Does "Calculator:Version 10.15.4 (213.3)" use 64 bit precision? It fails to provide values sometimes, particularly when using scientific notation on physics constants where EE is around -54. I know the Mac handles such values properly when programmed with Xcode. I use RPN mostly with "Calculator", though that shouldn't matter.
Posted Last updated
.
Post not yet marked as solved
0 Replies
422 Views
From the Xcode documentation I understand " For example, if you create a physics shape from an SCNSphere object, SceneKit simulates collisions for any object that passes within the sphere’s radius."Now I am trying to create a bounding box, where particles inside are contained by the walls of the box. I had painstakingly constructed six individual walls to form such a box, but was hoping there is a parameter I missed that allows non-collisions inside an SCNBox and collisions as they try to leave the friendly confines.
Posted Last updated
.