Swift 根据NSPopupButton中的选择更新NSTextField

Swift 根据NSPopupButton中的选择更新NSTextField,swift,xcode,cocoa,Swift,Xcode,Cocoa,我只编写了几个星期的代码,所以请原谅我毫无疑问的笨拙代码 我有一个NSTextField,需要根据nspoupbutton 以下是我的销售渠道: @IBOutlet weak var inputText: NSTextField! @IBOutlet weak var outputText: NSTextField! @IBOutlet weak var inputBrowseButton: NSButton! @IBOutlet weak var outputBrowseButton: NSB

我只编写了几个星期的代码,所以请原谅我毫无疑问的笨拙代码

我有一个
NSTextField
,需要根据
nspoupbutton

以下是我的销售渠道:

@IBOutlet weak var inputText: NSTextField!
@IBOutlet weak var outputText: NSTextField!
@IBOutlet weak var inputBrowseButton: NSButton!
@IBOutlet weak var outputBrowseButton: NSButton!
@IBOutlet weak var codecSelector: NSPopUpButton!
以下是我的变量:

// derive default path and filename from @IBAction of inputBrowseButton
var defaultUrl: URL! 
// derived from default of inputBrowse unless outputBrowse is used
var outputUrl: URL!
// change output path from @IBAction of outputBrowseButton
var outputDirectory: URL! 
// change path extension from @IBAction of codecSelector NSPopupButton
var codecChosen: String = "" 
// dictionary of arguments to form script for ffmpeg
var ffmpegCodecArg: String = ""
下面是我将所有这些整合起来的方法:

// construct output path for use in ffmpegArguments dictionary and display in outputText NSTextField
func updateOutputText(defaultUrl: URL?, outputDirectory: URL?) -> String {
    if defaultUrl != nil && outputDirectory != nil {
        let outputFile = defaultUrl!.deletingPathExtension()
        let outputFilename = outputFile.lastPathComponent
        outputUrl = outputDirectory!.appendingPathComponent(outputFilename)
        outputText.stringValue = outputUrl.path + "\(codecChosen)"
} else if defaultUrl == nil && outputDirectory != nil {
        outputText.stringValue = outputDirectory!.path
} else {
        outputUrl = defaultUrl!.deletingPathExtension()
        outputText.stringValue = outputUrl.path + "\(codecChosen)"
}
    return outputText.stringValue
}
现在这个函数不起作用了,因为我还没有弄清楚如何调用它。但这是下一次的问题,不是我想问的

以前我在跑步

        outputUrl = defaultUrl!.deletingPathExtension()
        outputText.stringValue = outputUrl.path + "\(codecChosen)"
作为我的
inputBrowseButton
@iAction
方法的一部分,我正在运行

        let outputFile = defaultUrl!.deletingPathExtension()
        let outputFilename = outputFile.lastPathComponent
        outputUrl = outputDirectory!.appendingPathComponent(outputFilename)
        outputText.stringValue = outputUrl.path + "\(codecChosen)"
作为我的
输出浏览按钮
@iAction
方法的一部分

除了更新
outputText.stringValue
时,在我的
@iAction
中为
codecSelector
方法为
codecSelector
变量分配了一个新值外,该方法工作正常

我怀疑问题在于我没有设置我的
outputText
NSTextField
以在
codecSelector
n更改时更新。我需要做什么才能做到这一点?

这很好,除了在CodeSelector NSPoupButton方法的my@iAction中为CodeSelector变量分配了一个新值时更新outputText.stringValue之外

尝试使用单独的方法更改文本

func changeText(inputString: String, inputField: NSTextField) {
    inputField.stringValue = inputString 
}

进一步分离代码可能会使您在开始时更容易跟踪。我对macOS并不完全熟悉,因此这种方法可能不起作用,但请尝试使用它的原理,看看您是否能取得进展。

您好,谢谢。如果我理解你的意思,我想这就是我试图使用包含的函数所做的,从
func updateOutputText(defaultUrl:URL?,outputDirectory:URL?)->String
开始,我将使用它开始工作。但我的问题是,当构建字符串(
codecselected
)所需的一个变量的值根据NspupButton的输入发生变化时,要更新NXTextField。你是说如果我让我的独立函数正常工作,那应该会自动发生吗?我想我明白你现在说的了。我调用该函数来更新CodeSelector弹出窗口的IBaction方法中的outputText字段,它现在可以工作了。我现在只需要找出弹出窗口的默认设置的问题。。。。我也是这样做的。我为CodeSelector弹出窗口创建了一个方法,并在我的方法中调用它来选择输入和输出文件。现在一切都好了。我很高兴现在一切都好了!如果我帮了忙,你介意给我一个提升票吗?我投了,虽然这不会影响可见的分数,因为我也是新来的。