2016-08-10 11 views
0

Я пытаюсь получить базовое представление о привязках к какао, и я хотел бы создать действительно простой проект. У меня есть класс Person, который имеет переменную name типа NSString. Вот как я хочу, чтобы работать:Простейший пример привязки какао

  1. Пользователь вводит имя в текстовое поле и нажимает «имя Обновить» кнопку
  2. строка из текстового поля сохраняется в экземпляре Person класса.
  3. Метка, привязанная к Контроллеру Person (привязанная к классу Person), автоматически изменяет свое значение в соответствии с переменной name экземпляра Person.

Я часами читаю различные учебники и библиотеку разработчиков Apple Mac, но каждый пример показывает, как заставить привязки Cocoa работать со столами. Когда я пытаюсь развить что-то гораздо более простое, я чувствую, что полностью потерял. Я создал базовый проект, и осталось только все привязки. Я любезно прошу сделать все связи для меня и, надеюсь, предоставить мне объяснение. https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 Проект - приложение на основе документов, потому что я буду разрабатывать приложение такого типа в будущем.

+0

Вы читали [Cocoa Bindings программирования Темы] (https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html#//apple_ref/doc/uid/10000167-BBCFBCAG)? Класс 'Person' должен быть совместимым с KVO. – Willeke

+0

Привязать значение метки к контроллеру, Ключ контроллера: 'selection', Путь к ключу модели:' имя'. Это все. – Willeke

+0

Если я просто делаю это, я получаю несколько исключений, и приложение не загружается. Я, очевидно, должен сделать некоторые подключения в своем объектном контроллере. Кроме того, возможно ли реализовать KVO в классе, т.е. е. могу ли я сделать класс «Личность» совместимым с KVO? Если вы можете предложить другой подход для выполнения той же задачи, над которой я работаю, пожалуйста, поделитесь своими знаниями. – Yashman

ответ

5

Существует несколько причин, по которым ваш проект не работает, поэтому можно начать снова и создать простейший пример привязки какао.

  1. Создать новый проект Xcode, выбрать приложение Cocoa и не проверять «Использовать раскадровки», «Создать приложение на основе документов» или «Использовать основные данные».
  2. Выберите MainMenu.xib, выберите окно и добавьте текстовое поле и метку.
  3. Добавить контроллер объекта в xib. Переключатель Prepares Content сверху.
  4. Связать текстовое поле с объектным контроллером: привязать Value к Object Controller, ключ контроллера selection и путь ключа модели name.
  5. Привязать ярлык к объективному контроллеру: привязать Value к Object Controller, ключ контроллера selection и путь ключа модели name.
  6. Build, Run, Test. Введите текст и нажмите Return.

Контроллер автоматически создает экземпляр NSMutableDictionary, который соответствует требованиям KVO для каждого ключа. Когда содержимое текстового поля изменяется, привязка текстового поля вызывает setValue:@"New Contents" forKey:@"name". Это означает, что привязка метки и ярлыка обновляется.

Почему ваш проект не работает:

  • В XIb, содержание контроллера объекта подключается к документу. Содержание контроллера должно быть Лицом, а не Документом. Вот почему вы получаете [<Document 0x618000100750> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.. Удалите это соединение.
  • Лицо класса не соответствует требованиям KVO. Когда имя изменяется, класс Person не генерирует уведомление об изменении, и привязка не замечает изменения. Это можно исправить, используя свойство для name вместо ivar. Вам не нужно использовать setValue:forKey:, чтобы изменить имя в коде, person.name = [field stringValue] в порядке.
  • Содержимое Контроллера объектов установлено в методе init документа. Это слишком рано, xib еще не загружен, а контроллер не существует. Установите содержимое в windowControllerDidLoadNib. Вместо addObject я бы использовал setContent, но addObject должен работать.
+0

Ваша помощь очень ценится, это просто объяснение, которое я искал. После внесения изменений, которые вы указали, мой проект стал полностью работать. – Yashman