iPhone - UIView, который ведет себя как UIViewController - PullRequest
0 голосов
/ 25 октября 2011

Мне нужно создать класс, который будет представлять UIVIew и иметь некоторый код для его инициализации, прежде чем он будет готов к показу.Мне нужно знать, когда представление готово, я имею в виду, мне нужно что-то вроде viewDidLoad или viewWillAppear, но, поскольку это UIVIew, в нем отсутствуют эти протоколы.

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

Как мне объявить этот класс?Если класс основан на UIView, у меня нет методов, о которых я говорил.

спасибо

Ответы [ 5 ]

3 голосов
/ 25 октября 2011

Есть ли причина не делать такого рода вещи внутри метода initWithFrame на UIView? Кроме того, вы можете делать дополнительные вещи на layoutSubviews. Контроллер представления имеет viewDidLoad, потому что представление загружено лениво (из пера или иначе - у него также есть loadView). Он имеет viewWillAppear и viewWillDisappear, потому что он управляет представлением (кстати, даже контроллер представления управляется другим контроллером представления - эти методы вызываются, когда у вас есть контроллер в UINavigationController или UITabBarController или такие классы, которые управляют UIViewControllers. - само представление на самом деле ничего не управляет. Все, что он знает, это как рисовать себя. Для этого у вас есть layoutSubViews, drawRect и т. д.

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

2 голосов
/ 25 октября 2011

Сценарий, который вы описали, не является причиной отказа от реализации UIViewController.Предположим, у вас есть контейнерное представление A и подпредставление B. Оба имеют свои собственные UIViewController AC и BC.Теперь на AC вы добавляете View B, управляемый BC:

[self.view addSubview:BC.view];
1 голос
/ 25 октября 2011

Мне нужно создать класс, который будет представлять UIVIew и иметь некоторый код для его инициализации, прежде чем он будет готов к показу. Мне нужно знать, когда представление готово, я имею в виду что-то вроде viewDidLoad или viewWillAppear, но, поскольку это UIVIew, ему не хватает этих протоколов.

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

Более конкретно: что именно вы пытаетесь достичь? Если вы ожидаете загрузки данных перед отображением представления, это может быть чем-то, что можно вставить в контроллер, вызывающий представление.

Чтобы проиллюстрировать мою мысль, представьте, что вы помещаете некоторый текст в UILabel, который вы читаете с диска. Чтение с диска на самом деле не связано с представлением. Представление заботится только о том, какой текст он отображает, а не о том, как он получил текст. Как только он будет прочитан с диска, вы можете создать UILabel с тем текстом, который вы прочитали. Это позволяет UILabel быть более гибким.

Этот пример может быть совсем не связан с тем, что вы делаете, но я использую его как пример различия между представлением и контроллером. Все, что не связано с отображением и отрисовкой вида, не должно принадлежать.

1 голос
/ 25 октября 2011

Реализация drawRect в youR UIView, а также флаг инициализации.Непосредственно перед отображением представления вызывается drawRect.Если флаг инициализации еще не установлен, выполните инициализацию и установите флаг.Это будет хорошо выглядеть только в том случае, если ваша инициализация может быть выполнена быстро (без длительных синхронных вызовов).

1 голос
/ 25 октября 2011

Возможно, вы хотите использовать UIViewController.

Вам не нужно просто представлять их модально. Вы можете получить представление вашего контроллера вида с помощью yourViewController.view и добавить его как подпредставление любого представления, которое вы хотите.

Если вы ориентируетесь на iOS 5, есть несколько новых методов (например, addChildViewController:), предназначенных для облегчения таких вещей. Вы также можете сделать это на iOS 4, и он все равно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...