【问题标题】:Adding IBOutlets to Other Class Files in Swift?将 IBOutlets 添加到 Swift 中的其他类文件?
【发布时间】:2014-10-07 18:09:10
【问题描述】:

我正在尝试在 Swift 中为 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,但我似乎无法弄清楚如何去做..

谢谢!

【问题讨论】:

    标签: macos swift interface-builder xcode6


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2012-03-08
      • 2021-10-06
      • 2014-08-12
      • 1970-01-01
      • 2018-12-01
      • 2018-11-29
      相关资源
      最近更新 更多