Вложенные ViewControllers и их отпечаток памяти? Улучшения, если это очень плохо? - PullRequest
0 голосов
/ 02 марта 2011

@ Джона указал мне на следующее объяснение, которое он предоставил: Вопрос о представлении View Controller

В настоящее время у меня есть MainViewController , чье основное (корневое?) Представлениесодержит кнопку UIB Add Record, которая связана со следующим методом и зависит от того, какую страницу пользователь в данный момент открыл в UIScrollView:

#pragma mark -
#pragma mark Add View Support

- (void)add:(id)sender {

MyAddViewController *controller = nil;

    // Dynamically creating and allocating the Add View Controller
if (dataViewPageControl.currentPage == 0) {
    controller = [[MyAddViewController alloc] initWithAddType:1];
} else {
    controller = [[MyAddViewController alloc] initWithAddType:0];
}

controller.delegate = self;

    // Slide the new AddViewController's view in from the right
    CGPoint initialCenter = self.view.center;
controller.view.center = CGPointMake(initialCenter.x + 320, initialCenter.y);
[self.view addSubview:controller.view];

[UIView beginAnimations:@"animation" context:NULL];
[UIView setAnimationDuration:0.35];
[UIView setAnimationDelegate:controller];
controller.view.center = CGPointMake(initialCenter.x, initialCenter.y);
[UIView commitAnimations];

}

MainViewControllerявляется делегатом для MyAddViewController (который имеет кнопку CANCEL / CLOSE), и когда нажимается его кнопка закрытия, MyAddViewController освобождается с помощью метода close в этом MainViewController.

Как видите, представление MyAddViewController становится подпредставлением длятекущее корневое представление (Bad? Bad? Bad?). Представление MyAddViewController является представлением полного размера (320x416), но его верхняя половина прозрачна, так что представление MainViewController можно увидеть ниже в верхней половине, а нижняя половина содержит представление AddViewController.и текстовые поля и т.д ....

На основании чегоЯ только что прочитал @Jonah по ссылке в самом верху, такой дизайн - BAD, BAD, BAD.При тестировании в Instruments я заметил, что MyAddViewController иногда отстает при скольжении. Я нажму кнопку ADD, чтобы запустить этот метод, и иногда перед задержкой от 3 до 5 секундвид скользит. Какая-то задержка во всем управлении памятью и очистке?

Я предполагаю, что смогу исправить это, создав одно свойство MyAddViewController внутри MainViewController, которое будет препятствовать распределению и освобождению при каждом нажатии кнопки.Это должно сделать вещи более гладкими?Мое единственное беспокойство заключается в том, что это вызовет больший отпечаток памяти во время загрузки приложения. Instruments , кажется, показывает выделение 516 КБ каждый раз, когда я впервые нажимаю ADD в своем приложении.

Есть какие-нибудь рекомендации по дизайну и как это улучшить?Причина, по которой мне нравится иметь отдельные контроллеры представлений с такими вложенными представлениями, заключается в том, что MyAddViewController имеет lot логики с Core Data и тому подобным, и MainViewController уже достаточно занят, как есть.Пытаться держать вещи модульными.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Я думаю, что лучшее решение - изменить ваш MyAddViewController на контроллер, который наследуется от NSObject, а не UIViewController. MyAddViewController может затем управлять подпредставлением вашего MainViewController, позволяя вам аккуратно инкапсулировать логику вашего контроллера, не злоупотребляя UIViewController.

Я пытался описать, почему вложение представлений нескольких пользовательских UIViewController классов проблематично здесь: http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

0 голосов
/ 02 марта 2011

Контроллер добавления представления является идеальным типом для использования модального представления. Вместо того, чтобы обрабатывать всю эту анимацию самостоятельно, просто представьте ее так:

[self presentModalViewController:controller animated:YES];

Редактировать

Тогда я бы рекомендовал сделать MyAddViewController свойством MainViewController и написать собственный метод доступа. Кроме того, я бы отложил установку его addType (если это возможно) до точки, в которой вы фактически оживите представление. Таким образом, у нас может быть просто один общий MyAddViewController, вместо того, чтобы создавать новый каждый раз, когда изменяется detailPageControl.

- (MyAddViewController *)addViewController
{
    if (!addViewController)
        addViewController = [[MyAddViewController alloc] init];
}

Тогда, прежде чем оживить это ...

self.addViewController.addType = 0;

if (dataViewPageControl.currentPage == 0) {
    self.addViewController.addType = 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...