Когда использовать UIView по сравнению с UIViewController на iPhone?

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

class Program
{
    static void Main(string[] args)
    {
        var x = new MyClass<string>() { Value = "34" };
        var y = new MyClass<int>() { Value = 3 };

        var list = new List<IMyClass>();
        list.Add(x);
        list.Add(y);

        foreach (var item in list)
        {
            Console.WriteLine(item.GetValue);
        }
    }

    private interface IMyClass
    {
        object GetValue { get; }
    }

    private class MyClass<T> : IMyClass
    {
        public T Value;

        public object GetValue
        {
            get
            {
               return Value;
            }
        }
    }
}

, т.е. Пусть MyClass реализует пустой интерфейс, а затем создает ваши коллекции в виде экземпляров классов, которые реализуют этот интерфейс.

Обновление: Я добавил метод «GetValue» в интерфейс, который позволяет вам получить доступ к «Значение» экземпляра MyClass как объекта. Насколько это возможно, если вы хотите иметь коллекцию, содержащую смешанные типы.

55
задан Andrew Johnson 6 November 2009 в 12:15
поделиться

7 ответов

Из руководства Apple по программированию контроллера View для iOS :

«Самая важная роль контроллера представления - управлять иерархией представлений. Каждый контроллер представления имеет единственное корневое представление, которое включает в себя все содержимое контроллера представления. К этому корневому представлению вы добавляете представления, необходимые для отображения вашего контента. "

Также:

"

39
ответ дан 7 November 2019 в 07:29
поделиться

Это отличный вопрос.

Мое основное практическое правило. Разве каждая основная «страница» приложения получает собственный контроллер представления. Под этим я подразумеваю то, что на этапе создания каркаса при проектировании приложения все, что существует как отдельная сущность, в конечном итоге будет управляться собственным контроллером представления. Если есть модальный экран, который скользит по существующему экрану, я буду считать его отдельной «страницей» и предоставлю ему собственный контроллер представления. Если есть представление, которое перекрывает и существующую страницу (например, экран загрузки или всплывающее окно справки). Я бы относился к ним по-другому, реализовал их как подклассы UIView и сохранил логику в этом контроллере представления «страниц». Если всплывающее окно имеет поведение, я сообщу обратно этим страницам View Controller, используя шаблон делегата.

Надеюсь, это поможет.

11
ответ дан 7 November 2019 в 07:29
поделиться

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

4
ответ дан 7 November 2019 в 07:29
поделиться

У меня есть несколько другой подход:

Переопределите UIView, если вы планируете выполнять пользовательское рисование в drawRect. В противном случае создайте подкласс UIViewController и используйте [self.view addSubview: blah] для добавления компонентов страницы.

Есть несколько других особых случаев, но это обрабатывает около 95% ситуаций.

(Вы все равно будете часто требуется UIViewController с настраиваемым UIView. Но обычно используется настраиваемый UIViewController без соответствующего настраиваемого UIView.)

2
ответ дан 7 November 2019 в 07:29
поделиться

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

0
ответ дан 7 November 2019 в 07:29
поделиться

UIView является частью UIViewController, для этого см. Свойство view UIViewController. Как вы правильно указали, UIViewController управляет полным экраном, и одновременно должен быть только один видимый UIViewController. Но в большинстве случаев у вас будет больше UIViews или подклассов UIView, видимых на экране.

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

Как заметил Марк, если то, что вы хотите вставить, не является автономным экраном, вам лучше использовать UIView.

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

В классе itunes U Standford есть отличная лекция по UIViewControllers, я бы рекомендовал ее посмотреть, потому что в нем много информации о UIViewControllers в целом.

0
ответ дан 7 November 2019 в 07:29
поделиться

Поместите все на экране в UIViewController, пока контроллер представления не станет содержать слишком много кода, затем разбейте экран на несколько UIViewController, содержащихся в одном главном контроллере представления ...

Чтобы поместите это в контекст своего ответа, создайте контроллер представления для этого модального наложения. Он все равно будет иметь его, если вы используете навигационный контроллер для его представления (а вам, вероятно, следует).

1
ответ дан 7 November 2019 в 07:29
поделиться