У меня есть этот UIViewController, установленный в моей раскадровке, со всеми точками, представлениями и ограничениями, которые мне нужны. Отлично. Назовем этот WatchStateController, он будет служить абстрактным родительским классом.Как изменить имя класса UIViewController в UIStoryboard во время выполнения
У меня есть этот подкласс WatchStateController, называемый WatchStateTimeController, который будет иметь функциональность, необходимую для конкретного состояния приложения.
Поскольку я пытаюсь использовать контроллер вида 1 в UIStoryboard, у меня возникают некоторые проблемы с созданием WatchStateTimeController в качестве типа WatchStateTimeController - он создается как WatchStateController.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
WatchStateTimeController *timeController = (WatchStateTimeController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"WatchStateController"];
Это происходит потому, что поле «Класс» в раскадровке идентичности инспектора установлен в положение «WatchStateController». Итак, вопрос в том, как просто изменить это имя класса, установленное в Identity Inspector во время выполнения?
Примечание: игнорировать почему я пытаюсь сделать это и сосредоточиться на как. Если вы действительно должны знать, почему, вы можете ознакомиться с шаблоном проектирования стратегии.
Рассмотрите возможность изменения вашей интерпретации шаблона проектирования стратегии, чтобы лучше соответствовать структуре приложения, которое вам дано с помощью раскадровки: вместо использования наследования для изменения поведения вашего контроллера представления используйте агрегацию. Другими словами, есть свойство на WatchStateController, которое ссылается на другой объект некоторого базового класса или типа протокола, который может обеспечить желаемое поведение как своего рода делегат. –
Спасибо. Я очень хорошо знаком с агрегацией и композицией - я использую ее в 95% случаев. К сожалению, использование этого здесь не имеет смысла, это приведет к повторной работе, копированию и вставке того же кода, чего я хочу избежать. Избыточность - это враг. Если это ограничение при использовании раскадровки, вы правы, вам нужно будет найти вариант шаблона. Вопрос в том, совместим ли стиль состояния/стратегии при использовании раскадровки? Или я должен просто сдаться и заманить код кучей инструкций IF/ELSE (что схема стратегии действительно предназначена для предотвращения) – PostCodeism
Возможно, я прочитал это неправильно или быстро, но изображение, которое вы включили в раскадровку, показывающую watchstatecontroller, и вы хотите изменить его ... не должно быть WatchStateTimeController, поскольку вы подклассифицируете его, и это представление, которое вы хотите от подкласса? возможно, я мог бы использовать более простое описание. Например, у вас есть класс для просмотра a и вы подклассифицировали класс a для класса b для представления b, но ваша проблема - это просмотр b, выполняющийся с классом a? – rezand