使用Swift 2在OSX上设置桌面背景

时间:2015-08-05 18:29:07

标签: macos swift cocoa swift2

在介绍Javascript之后,我试图通过创建一些简单的工具来解决我自己的问题,从而解决OSX / iOS编程问题。

但是,从跳跃开始,我遇到了障碍。

我找到了两个应该有用的例子。

  1. https://github.com/hinderberg/ios-swift-kurs/blob/master/swift-intro/wallpaper.swift
  2. https://www.snip2code.com/Snippet/196825/Swift-shell-script-to-randomize-wallpape
  3. 这是第二个:

    #!/usr/bin/env xcrun swift
    
    import Foundation
    import AppKit
    let imagesDir = "/Users/david/Dropbox/Graphics/Wallpaper-HD/"
    var err: NSError?
    
    let fs = NSFileManager.defaultManager()
    let filenames = fs.contentsOfDirectoryAtPath(imagesDir, error: &err) as [String]?
    
    if let error = err {
      NSLog(error.localizedDescription)
    } else {
    
      let imagenames = filenames!.filter { $0.hasSuffix(".jpg") || $0.hasSuffix("png") }
      let ir = Int(arc4random_uniform(UInt32(imagenames.count)))
      let imgurl = NSURL.fileURLWithPath(imagesDir + imagenames[ir])
    
      let workspace = NSWorkspace.sharedWorkspace()
      let screen = NSScreen.mainScreen()
      let ok : Bool = workspace.setDesktopImageURL( imgurl!, forScreen: screen!, options: nil, error: nil )
    
      if ok { 
        println( "New wallpaper: " + imagenames[ir] ) 
      } else { 
        println("Oops!")
      }
    }
    

    这在XCode 7 beta 3中无效。

    希望减少到必需品,我到达:

    #!/usr/bin/env xcrun swift
    import Foundation
    import AppKit
    let imagesDir = "/Users/josh/Downloads/"
    let singleImage = "/Users/josh/Downloads/xlarge.png"
    
    
    let imgurl = NSURL.fileURLWithPath(singleImage)
    
    let workspace = NSWorkspace.sharedWorkspace()
    let screen = NSScreen.mainScreen()
    let ok : Bool = workspace.setDesktopImageURL( imgurl, forScreen: screen!, options: nil, error: nil )
    
    if ok {
        print( "New wallpaper set!" )
    } else {
        print("Oops!")
    }
    

    并保存为文件wallpaper.swift

    执行时,错误是:

    ./wallpaper.swift:17:49: error: extra argument 'error' in call
    let ok : Bool = workspace.setDesktopImageURL( imgurl, forScreen: screen!, options: nil, error: nil )
    

    现在我完全陷入困境...... 我尝试过引用NSWorkspaceNSScreen文档以及在游乐场中运行,但它超出了我目前的技能。

    删除它抱怨的额外参数(错误:nil)只会产生不同的错误:

    ./wallpaper.swift:13:31: error: cannot invoke 'setDesktopImageURL' with an argument list of type '(NSURL, forScreen: NSScreen?, options: nil)'
    let ok : Bool = workspace.setDesktopImageURL( imgurl, forScreen: screen, options: nil )
    

    代码失败的地方,我如何理解如何使其正常工作?

4 个答案:

答案 0 :(得分:4)

在您的示例中,您将nil作为options传递给该方法。

我猜它之前有效但现在你在评论中显示了当前的方法签名:

(url: NSURL, forScreen screen: NSScreen, options: [String : AnyObject]) throws

我们看到options应该是非可选字典。

这意味着您无法再使用nil options参数:如果您没有选项,只需传递一个空字典。

此外,现在在Swift 2中,此方法不再返回Bool,它会抛出。

意味着您必须将其与do try catch一起使用:

do {
    let imgurl = NSURL.fileURLWithPath(singleImage)
    let workspace = NSWorkspace.sharedWorkspace()
    if let screen = NSScreen.mainScreen()  {
        try workspace.setDesktopImageURL(imgurl, forScreen: screen, options: [:])
    }
} catch {
    print(error)
}

答案 1 :(得分:1)

Swift 3的更新示例:

do {
   let imgurl = NSURL.fileURL(withPath: singleImage)
   let workspace = NSWorkspace.shared()
   if let screen = NSScreen.main()  {
       try workspace.setDesktopImageURL(imgurl, for: screen, options: [:])
   }
} catch {
   print(error)
}

答案 2 :(得分:1)

Swift 5.x 的更新版本:

do {
    let imageURL = URL(fileURLWithPath: "/path/to/image")
    if let screen = NSScreen.main {
        try NSWorkspace.shared.setDesktopImageURL(imageURL, for: screen, options: [:])
    }
} catch {
    print(error)
}

答案 3 :(得分:0)

对于使用Xamarin Mac的我们来说,可以这样实现:

string filepath = "/Users/you/Desktop/sweet-wallpaper.jpg";

var workspace = NSWorkspace.SharedWorkspace;
var screen = NSScreen.MainScreen;

NSUrl url = NSUrl.FromFilename(filepath);
NSDictionary options = new NSDictionary();
NSError errorContainer = new NSError();

workspace.SetDesktopImageUrl(url, NSScreen.MainScreen, options, errorContainer);