2012-07-22 1 views
9

Short ВопросЧто может сделать «Объект» в библиотеке объектов Storyboard?

Существует вещь, называемая Object в библиотеке объектов Xcode интерфейса: строитель. Интересно, какая задача может быть достигнута при использовании этого «Объекта».

Будьте конкретным, это NSObject в раскадровке (или xib). Описывается следующее:

Предоставляет шаблон для объектов, которые непосредственно не доступны в Interface Builder. Вы можете превратить этот объект в экземпляр любого класса, используя инспектор пользовательского класса.

Long Вопрос

Я пытаюсь построить UITableViewController вместе с UISearchController. Поскольку они оба требуют реализовать в своем деле UITableViewDelegate и UITableViewDatasource, я хотел бы назначить делегат UISearchController объекту, отличному от Main UITableViewController.

Я ищу способ добиться этого в раскадровке, вместо того, чтобы назначать делегат вручную в viewDidLoad. Особенно, выясняя, как работают Object в Раскадровке.

Я понимаю, что я могу отличить их от экзамена родителей UITableView. Но всегда полезно разделить логику на разные объекты. Это будет проще реализовать, повысить эффективность, улучшить структурирование и возможность повторного использования.

Заранее спасибо.

То, что я пытался

  • Положите Object на том же уровне UITableViewController в раскадровке (Вы не можете поместить Object внутри другого UIViewController).
    Связать с @property (nonatomic, weak) IBOutlet NSObject * в UITableViewController.
    NSObject * оказывается указателем nil, когда я печатаю его в viewDidLoad. Не повезло.
  • Отменяя объект на @property (nonatomic, strong), он становится UICustomObject вместо nil. Кажется, я на правильном пути.
+0

«Объект» используется для предоставления ссылки на построитель интерфейса для ваших пользовательских классов и их входов и выходов. – esqew

+0

Думаю, я получаю это. Попытка поиграть. Спасибо за комментарий. –

ответ

9

Как вы заметили, Object делает так, чтобы объект любого класса, включая ваш собственный пользовательский класс, создавался при загрузке XIB/Storyboard. Тот факт, что вы получаете UICustomObject, указывает на то, что механизм загрузки XIB/Storyboard либо не знает, какой класс должен быть объектом, либо не может найти класс (через просмотр времени выполнения), который вы указали.

Решения, чтобы убедиться, что вы указали правильный класс для объекта в пользовательском классе инспекторе:

enter image description here

Тогда, конечно, вы также должны убедиться, что файл реализация для класса вопрос находится в вашем проекте и включен в вашу цель.

И, наконец, правильно использовать strong для IBOutlet, указывающего на ваш пользовательский объект, потому что на объект верхнего уровня и объекты верхнего уровня следует ссылаться с использованием свойств strong. (Если вам действительно интересно, Майк Эш имеет хороший article об особенностях управления памятью XIB/Storyboard, в том числе о различиях между OS X и iOS в этом отношении.)

+0

Благодарим вас за это хорошее объяснение. Помимо этого, я также обнаружил некоторые интересные факты. 1. Поскольку этот объект создается Storyboard во время выполнения, невозможно указать любой аргумент для инициализатора. 2. Сам объект не может быть подключен к сеансу или вызывает его, он должен вызвать главный контроллер вида. –

+0

Уважаемый @AndrewMadsen, вы можете узнать ответ на этот вопрос. Http://stackoverflow.com/q/26043973/294884 ... Я тонкий, он относится к этим загадочным объектам «Объект» !! приветствия ... – Fattie

5

Этот вопрос был помечен как ответный, но так как он является открытым вопросом, на который может быть несколько ответов, есть умный метод для этого, как вы говорите, - разбивая функциональность в отдельные классы роли, которую автор называет «Поведением»:

http://www.objc.io/issue-13/behaviors.html

Суть в том, что вы можете написать объект, который, например, выполняет эффект параллакса, подвергая розетки нескольким представлениям. Он задается как делегат представления прокрутки и обновляет другое представление на основе настраиваемых параметров. Как вы отметили, вы не можете передавать аргументы конструктору, но вы все равно можете указать параметры с помощью механизма ключевого пути, проиллюстрированного на изображении в ответе @ Andrew.

Как вы также отметили, вы можете столкнуться с проблемой, когда вы хотели бы, чтобы разные объекты реагировали на события прокрутки и т. Д. Автор обратился к этому путем кодирования простого мультиплексора. Вы также можете решить эту проблему с цепочки ответственности: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern.

И, наконец, @Andrew упомянул в своем ответе важность хранения объекта как сильного свойства. Они автор вышеупомянутой статьи - позволяет просто называть его «Krzysztof», предоставляет решение с использованием связанного с объектами объекта obj-c, чтобы обеспечить возможность конфигурирования без кода. Ваш пробег может очень с этим, и теперь с Swift могут быть лучшие варианты, но, по крайней мере, это хорошая идея для размышлений.