2017-02-13 2 views
0

Hello Sultans of Swift!Swift NSTextField stringValue не отображает установленное значение

Я новичок в Swift, хотя я много использовал C, C++ и C#. Я столкнулся с ситуацией, которая действительно озадачивает меня. Я собираюсь опубликовать фрагмент кода здесь:

@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 переменной она просто отображает пустое пространство, но я могу фактически напечатать переменную консоль просто отлично. Переменная задается как возвращаемое значение функции. Теперь, если я вместо этого задал переменную явно строковой константе, тогда она работает. Это может быть связано с неопределенностью возвращаемого значения функции, но я знаю, что он содержит текст, потому что я могу распечатать его на консоли.

Может ли кто-нибудь определить, что здесь происходит?

Благодаря

EDIT: Я просто установил комментарии в коде для обозначения songTitle вместо имя_файла - извините за путаницу. Речь идет о настройке songTitle.stringValue = титул

EDIT: Это определение songTitle:

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

Обратите внимание, что установка свойства stringValue из них на самом деле работает так долго, как я не использовать переменную которому присваивается возвращаемое значение mp3File.getTitle(). Также обратите внимание, что mp3File.getTitle() возвращает значение, и я могу распечатать его на консоли OK.

+0

Что вы получаете с 'debugPrint (title)'? – OOPer

+0

Привет, извините за задержку в ответе - меня не было. Вот 3 отлаживать заявления, которые я добавил: – daeljan

+0

DebugPrint ("DEBUG TEXT") DebugPrint (название) DebugPrint (songTitle.stringValue) – daeljan

ответ

0

Если у вас есть строковое значение, которое print изд прекрасно:

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 
+0

Приветствия за ответ @OOPer – daeljan

+0

Отличный ответ - очень всеобъемлющий! – daeljan

 Смежные вопросы

  • Нет связанных вопросов^_^