gpt4 book ai didi

Swift NSTextField stringValue 不显示设置值

转载 作者:行者123 更新时间:2023-11-30 12:41:07 27 4
gpt4 key购买 nike

你好, swift 苏丹!

虽然我经常使用 C、C++ 和 C#,但我还是 Swift 新手。我遇到了一个让我非常困惑的情况。我将在这里发布一个代码片段:

@IBAction func myFunc(sender: AnyObject)
{
let dirPicker: NSOpenPanel = NSOpenPanel()
dirPicker.allowsMultipleSelection = false
dirPicker.canChooseFiles = true
dirPicker.canChooseDirectories = false
dirPicker.runModal()

let selection = dirPicker.URL

if(selection != nil)
{
do
{
print(selection)
let mp3File = try MP3File(path: (selection?.path)!)
let title = mp3File.getTitle()

// This prints OK
print("Title:\t\(mp3File.getTitle())")

// This prints OK too
print("Title:\t\(title)")

print("Artist:\t\(mp3File.getArtist())")
print("Album:\t\(mp3File.getAlbum())")
print("Lyrics:\n\(mp3File.getLyrics())")

fileName.stringValue = (selection?.path)!

// This sets the label songTitle to an empty space and I can't see why.
// If I initialise title to:
// let title = "STRING CONSTANT"
// ...instead of
// let title = mp3File.getTitle()
// ...then it does actually set the correct text on the label songTitle.
// In both cases, printing to the console works fine! Its just setting
// the text on the label that is eluding me!
songTitle.stringValue = title
}
catch ID3EditErrors.FileDoesNotExist
{
print("Error: File Does Not Exist")
}
catch ID3EditErrors.NotAnMP3
{
print("Error: Not an MP3")
}
catch let e
{
print(e)
}
}
}

当我尝试通过将其 stringValue 属性设置为变量来设置标签中的文本时,它仅显示空白,但实际上我可以将变量打印到控制台。该变量被设置为函数的返回值。现在,如果我将变量显式设置为字符串常量,那么它就可以工作了。所以这可能与函数返回值的不确定性有关,但我知道它包含文本,因为我可以将其打印到控制台。

有人能发现这里到底发生了什么吗?

谢谢

编辑:我刚刚修复了代码中的注释以引用歌曲标题而不是文件名 - 对于造成的困惑表示抱歉。这是关于设置songTitle.stringValue = title

编辑:这是songTitle的定义:

@IBOutlet weak var fileName: NSTextField!
@IBOutlet weak var songTitle: NSTextField!

请注意,只要我不使用分配了 mp3File.getTitle() 返回值的变量,设置这些的 stringValue 属性实际上就有效。另请注意,mp3File.getTitle() 确实返回一个值,我可以将其打印到控制台。

最佳答案

当你有一个可以打印的字符串值时:

print(title) //->I Ran

但不能很好地处理:

songTitle.stringValue = title //->`songTitle` shows nothing!!!

(当然,您已经通过为其分配常量字符串来确认 songTitle 没问题。)

一个可能的原因可能是字符串中存在一些控制字符。

您可以使用debugPrint来揭示此类情况:

debugPrint(title) //->"\0I Ran\0"

debugPrint 使用类似字符串文字的格式来显示控制字符。

在本例中,两端都有 NUL 字符 (U+0000)。

因此,一个快速修复方法是在每次获得此类字符串时修剪它们:

Swift 2:

let title = mp3File.getTitle().stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "\0"))

Swift 3:

let title = mp3File.getTitle().trimmingCharacters(in: CharacterSet(charactersIn: "\0"))
<小时/>

或者,如果您无法触及库的原始来源,您可以编写扩展:

Swift 2:

extension MP3File {
var title: String {
return self.getTitle().stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "\0"))
}
}

Swift 3:

extension MP3File {
var title: String {
return self.getTitle().trimmingCharacters(in: CharacterSet(charactersIn: "\0"))
}
}

(假设 MP3File 没有名为 title 的属性。)

并将其用作:

let title = mp3File.title

关于Swift NSTextField stringValue 不显示设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42213593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com