在Swift中将IBOutlets添加到其他类文件?

时间:2014-10-07 18:09:10

标签: macos swift interface-builder xcode6

我试图在Swift for OS X(使用Xcode 6.1 GM)中构建一个应用程序,这是一个MenuBar代理,只有一个偏好窗口。

虽然我已经能够让我的菜单功能大部分都能正常工作,但这一切都存在于AppDelegate中并且看起来非常混乱。

import Cocoa
import AppKit
import Foundation

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {


var downloadClass = DownloadController()


@IBOutlet weak var window: NSWindow!
@IBOutlet weak var downloadButton: NSButton!
@IBOutlet weak var subredditField: NSTextField!

@IBOutlet weak var nsfwMarked: NSButton!
@IBOutlet weak var sortFilter: NSPopUpButton!

var statusBar = NSStatusBar.systemStatusBar()
var statusBarItem : NSStatusItem = NSStatusItem()
var menu: NSMenu = NSMenu()
var subSort: NSMenu = NSMenu()

override func awakeFromNib() {
    //Add statusBarItem

    statusBarItem = statusBar.statusItemWithLength(-1)
    statusBarItem.menu = menu

    let icon = NSImage(named: "arrow16black")
    statusBarItem.image = icon

    var downloadItem: NSMenuItem = NSMenuItem()
    downloadItem.title = "Download"
    downloadItem.action = Selector("downloadPressed:")
    downloadItem.keyEquivalent = ""
    menu.addItem(downloadItem)

    var menuItem: NSMenuItem = NSMenuItem()
    menuItem.title = "Preferences..."
    //Open view on button click
    menuItem.action = Selector("setWindowVisible:")
    menuItem.keyEquivalent = ""
    menu.addItem(menuItem)

    //define sorting filters
    let sortOptions = NSArray(array: ["Hot","New","Top","Rising","Controversial"])
    sortFilter.addItemsWithTitles(sortOptions)

    var sortItem: NSMenuItem = NSMenuItem()
    sortItem.title = "Sort By"
    menu.addItem(sortItem)

    //Add sort options as submenu
    for sort in sortOptions {
        var item: NSMenuItem = NSMenuItem()
        item.title = sort as String
        item.keyEquivalent = ""
        item.action = Selector("setActiveSort:")
        subSort.addItem(item)
    }
    menu.setSubmenu(subSort, forItem: sortItem)

    //Test receiving menu
    let userDefaults = NSUserDefaults.standardUserDefaults()
    if let filterDefault : AnyObject = userDefaults.objectForKey("filter") {
        var active : NSString = filterDefault as NSString
        sortFilter.selectItemWithTitle(active)
        println(active)
        subSort.itemWithTitle(active)?.state = 1
    }
}

func setActiveSort(sender: NSMenuItem) {
    //Turn off all other active filters
    let allSorts = subSort.itemArray
    var a = 0
    while a < subSort.numberOfItems {
        var filter = subSort.itemAtIndex(a)
        filter?.state = 0
        a++
    }
    //Make selected filter active and store value in Defaults
    sender.state = 1
    sortFilter.selectItemWithTitle(sender.title)
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(sender.title, forKey: "filter")
}

@IBAction func downloadPressed(sender: AnyObject) {
    let subreddit: NSString = NSString(string: subredditField.stringValue)
    let sortBy: NSString = NSString(string: sortFilter.titleOfSelectedItem!)
    var sort = sortBy.lowercaseString
    let nsfw: Bool = Bool(nsfwMarked.integerValue)
    downloadClass.startController(subreddit, sortBy: sort, markNSFW: nsfw)
}

func setWindowVisible(sender: AnyObject) {
    self.window!.orderFront(self)
}

func applicationDidFinishLaunching(aNotification: NSNotification?) {
    // Insert code here to initialize your application
    //Don't display application window at launch
    self.window!.orderOut(self)

    //On launch, get user preferences if set
    let userDefaults = NSUserDefaults.standardUserDefaults()
    if let nsfwMarkedPref : AnyObject = userDefaults.objectForKey("NSFW?") {
        //Set nsfw state to stored value
        nsfwMarked.state = (nsfwMarkedPref.integerValue == 1) ? NSOnState : NSOffState;
    }
    if let storedSubreddit : AnyObject = userDefaults.objectForKey("subreddit") {
        //set subreddit string to stored value
        subredditField.stringValue = storedSubreddit as String
    }

    //Get screen resolution
    let ms = NSScreen.mainScreen()
    let frame = ms?.frame
    println(frame!.size.width)
}

func applicationWillTerminate(aNotification: NSNotification?) {
    // Insert code here to tear down your application

    //Set the user preferences on exit.. this should be moved to onButtonState
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(nsfwMarked.integerValue, forKey: "NSFW?")
    let subreddit: NSString = NSString(string: subredditField.stringValue)
    userDefaults.setObject(subreddit, forKey: "subreddit")
}


}

目前,我视图中的downloadButton的IBAction将调用DownloadController中的函数。但理想情况下,我希望能够在DownloadController.swift文件中拥有downloadPressed的IBAction,但我似乎无法弄清楚如何解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

创建XIB文件或使用故事板并将其文件所有者设置为UI视图控制器。然后在那里设置您的行动和出口。我建议你在继续之前观看一些视频。