Полиморфизм в Storyboard ViewControllers

Мне интересно, как я могу реализовать полиморфизм в раскадровке iPhone XCode ViewControllers.

Это моя проблема: два разных ViewController в моем приложении переходят к общему ViewController.

Этот общий ViewController ведет себя по-разному в зависимости от VC, из которого он был перенаправлен - выполняются различные вызовы удаленного API-сервера и выборки CoreData (для первого он представляет всех пользователей в таблице, для другого он представляет список администраторов - подкласс пользователей, и у меня может быть третий, который будет представлять отфильтрованный список пользователей).

Этот общий ViewController очень важен для моего приложения и переходит ко многим другим ViewController. Поэтому дублировать его на стройборде с сабклассом мне не кажется правильным.

Передача списка пользователей в ViewController, к сожалению, менее эффективна, поскольку различные поиски в этом списке выполняются и реализуются в методах ViewController.

Имеет смысл реализовать эти различные варианты поведения путем создания подклассов и использования полиморфизма, а также назначения ViewController в раскадровке подкласса в соответствии с исходным переходом.

Есть ли способ динамически установить классы Storyboard ViewController при переходе?


person asaf am    schedule 29.07.2013    source источник
comment
я не вижу причин добавлять свойство в ваш контроллер общего представления, чтобы определить, от какого uiviewcontroller вы переходите, а затем выполнять соответствующие вызовы.   -  person limon    schedule 29.07.2013
comment
@mstfbsnli Я понимаю вашу точку зрения, но я ищу более компактные классы и более чистое решение для кода. Я пытаюсь избежать условий if-else if-else для разных методов VC.   -  person asaf am    schedule 29.07.2013


Ответы (1)


выполняются различные вызовы удаленного API-сервера и выборка CoreData

Что вы действительно называете здесь, так это то, что интерфейс данных отличается от интерфейса просмотра. Это нормально. Вы должны вытащить отдельный объект, отвечающий за выборку данных. Вы можете передать этот объект контроллеру представления, а не полиморфировать контроллер представления. Это называется паттерном «Стратегия» и очень распространено в Cocoa.

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

person Rob Napier    schedule 30.07.2013
comment
Этот ответ отличный, и я реализую этот подход, но я понимаю, что в том же смысле нет возможности динамически установить класс ViewController. я прав? - person asaf am; 01.08.2013
comment
Конечно, есть способ :) это просто не очень хорошая идея для такого рода проблем. Вы можете isa-swizzle класс получателя в другой класс во время выполнения. Но здесь это было бы ужасной идеей. Isa-swizzling может привести к действительно удивительным ошибкам, если вы допустите какие-либо ошибки (например, добавление ivar в подкласс; однажды я сделал эту ошибку). - person Rob Napier; 01.08.2013
comment
Для получения дополнительной информации: developer.apple.com/library/ios/featuredarticles/ - person Rob Napier; 01.08.2013
comment
понятно. Я пойду с вашим подходом. Освежить свой разум с помощью паттерна Стратегия кажется правильным решением. - person asaf am; 01.08.2013