UIViewController: установить self.view для моего представления или добавить мое представление как subview? - PullRequest
3 голосов
/ 15 сентября 2009

У меня есть вопрос по поводу подпредставления UIViewController. Я создал подкласс UIView MainView, который имеет точный размер экрана. Интересно, какой способ лучше добавить MainView, рассмотрите следующие факторы:

1 Поскольку MainView имеет такой же размер, как и весь экран, у самого MainView могут быть подпредставления, но нет представлений на уровне сохранения как MainView (т.е. мне не нужно добавлять другие подпредставления в self.view). 1003 *

2 Если я использую self.view = mainView, нужно ли поместить код в loadView (так как метод viewDidLoad означает, что представление (self.view) уже загружено)? Я вижу, что метод loadView закомментирован по умолчанию, и если я добавлю код в этот метод, какой другой код мне нужно собрать (например, инициализировать другие аспекты приложения)?

3 Если я добавлю mainView через [self addSubview: mainView], есть ли на самом деле два внеэкранных буфера? Один для self.view, другой для mainView, оба имеют тот же размер, что и экран, и один расположен поверх другого (поэтому он тратит память)?

Большое спасибо!

Ответы [ 5 ]

2 голосов
/ 27 ноября 2009

Я не уверен, что полностью понимаю, что вы спрашиваете, но я постараюсь ответить на несколько ваших вопросов.

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

Вы можете назначить свой UIView в качестве представления UIViewController. Например:

MainView *mainView = [[MainView alloc] initWithFrame:CGRectMake(320.0, 480.0)];
self.view = mainView;
[mainView release]; //since the .view property is a retained property

в этом случае у вас есть код инициализации представления в методе -init. Просто переопределите это как:

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
              //initializations
        }
        return self;
}
1 голос
/ 27 января 2010

Вы должны реализовать loadView, если вы инициализировали свой контроллер вида с помощью NIB.

UIViewController позаботится о правильном определении размера своего "основного" вида. Это все, что вам нужно сделать:

- (void)loadView
{
    UIView* mainView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    self.view = mainView;
}
1 голос
/ 17 ноября 2009

Я бы все решил, сделав это в xib! Если вы создаете UIView в xib, вы можете изменить его класс (когда вы выбираете UIView, в разделе Class Identity инспектора идентификации должно быть текстовое поле * - введите здесь 'MainView'!)

Затем создайте свой контроллер вида, вызвав

myViewController = [[MainViewController alloc] initWithNibName:@"MyNibName" bundle:nil]; 

Это должно решить ваши проблемы; это основное подпредставление вашего контроллера представления (напрямую доступное из self.view), и вам не нужно беспокоиться об использовании памяти, есть только одно представление:)

Sam

NB * Нажмите инструменты -> Identity Inspector. Я не знал, как это называется, пока мне не пришлось написать этот ответ!

0 голосов
/ 21 июня 2013

Возможно, самое важное, что нужно сделать, это убедиться, что у вас есть следующее:

self.view.userInteractionEnabled = YES;

Хотя это может и не требоваться постоянно, это устраняет проблему, когда self.view не отвечает. Эта проблема иногда появляется.

0 голосов
/ 25 сентября 2010

Да, первый фрагмент кода, показанный выше, является «стандартным» подходом, AFAIK, когда не используются (злые!) Файлы NIB - то есть при выделении вашего представления в коде через loadView.

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

UIView *myView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
self.view = myView; 
[myView release];

Обратите внимание, что вы определенно хотите сделать вызов [myView release] , поскольку, как указано выше, self.view (для UIView) сохраняется свойство.

Приветствия, -dk

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