2012-06-11 7 views
0

В настоящее время проект имеет UIviewController под названием «Панель мониторинга», который выступает в качестве основного вида всего приложения. Этот основной вид состоит из двух подзаголовков поверх него, вроде как splitview. Левая сторона основного (вид слева) имеет несколько кнопок. Правая сторона (правый вид) отобразит содержимое выбранной кнопки слева.UIViewcontroller с несколькими видами

При нажатии кнопки она будет создавать новый экземпляр зрения, который собирается показать, как это:

vcMySchedule_iPad *vcSchedule = [[vcMySchedule_iPad alloc] initWithNibName:@"vcMySchedule_iPad" bundle:nil]; 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcSchedule]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

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

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

Есть ли какой-либо подход к этому?

Обновлено с некоторыми изображениями ...

Main (MainViewController): enter image description here

прессованные Каталог курсов:

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil]; 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

enter image description here

При выборе строки образуют таблицу, отображает детали, и если пользователь нажимает кнопку, то на дисплее отображается макс.

enter image description here

Я думаю, что, возможно, вызывая новые взгляды неправильно, возможно. Где выпущены объекты?

ответ

0

Без дополнительной информации, я не могу дать твердый совет, но проверьте следующее:

  1. Вы используете ARC? Если не, помните, что вы должны явно освободить все ссылки, прежде чем что-то будет dealloc'd.
  2. Поддерживаете ли вы ссылку на подзаголовок где-нибудь еще? Если вы все еще ссылаетесь на него где-нибудь (особенно в ARC), он будет придерживаться. Циркулярные ссылки здесь злые.
  3. Вы удаляете subview из своего супервизора, прежде чем заменять его новым? Вы будете удивлены, как часто это так просто.

EDIT:

В ответ ниже, о вы не используете ARC, его совершенно очевидно, что 1) это ваша проблема. Вы не публикуете ссылки. В этом случае, кажется, совершенно очевидно, здесь:

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil]; ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

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

Ваш код должен выглядеть примерно так:

vcCourseCatalog_iPad *vcCourse = [[[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil] autorelease]; 

if(ncDashboard) 
{ 
    //do any sort of removal from views here 
    //[ncDashboard.view removeFromSuperview]; 
    [ncDashboard release]; 
} 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 
ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 
ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 
+0

Я не использую ARC. Я удаляю представление с помощью метода в основном представлении, называемом removeViewsFromRight. Поскольку пользователь может нажать любую кнопку на левой панели, мне нужно удалить представление из основного. – Angie

+0

В этом случае его довольно просто - как я упоминаю в 1), вы не выпускаете вещи после их создания. Когда вы создаете файл vcCourseCatalog_iPad, он имеет счет сохранения 1. Затем вы передаете его в UINavigationController, который внутренне сохраняет ссылку на него, увеличивая количество удержаний до двух. Когда UINavigationController освобождается, он освобождает vcCourseCatalog_iPad, давая ему удержание счета 1, от которого вы никогда не сможете избавиться, потому что нет ссылок на него. Если вы автоматически зарегистрируете файл vcCourseCatalog_iPad, тогда он будет обработан правильно. – CrimsonDiego

+0

Спасибо за помощь. Знаю, я понимаю лучше. – Angie

0

В дополнении к ответу CrimsonDiego, я бы предположить, что вы используете Подписки строку в файлах:

В файле .h:

@property (nonatomic, retain) UIView *ncDashBoard; 

В файле .m:

@synthesize ncDashBoard = _ncDashBoard; 

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

+0

Отт, спасибо за отзыв. – Angie

Смежные вопросы