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

问题描述:

我想在Swift中为OS X(使用Xcode 6.1 GM)构建一个应用程序,该应用程序是具有单个窗口的MenuBar代理程序,用于首选项。将IBOutlets添加到Swift中的其他类文件?

尽管我已经能够获得大部分的菜单栏功能,但它都存在于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文件中拥有IBAction的downloadPressed,但我似乎无法弄清楚如何去做这件事..

谢谢!

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