0

Я строй сегментированного контроля в моем методе viewDidLoad, например, так:Как удалить сегментированный контроллер из uinavigationcontroller после просмотра?

NSArray *tabitems = [NSArray arrayWithObjects:@"ONE", @"TWO", nil]; 
UISegmentedControl *tabs = [[UISegmentedControl alloc] initWithItems:tabitems]; 
tabs.segmentedControlStyle = UISegmentedControlStyleBar; 
tabs.frame = CGRectMake(185.0, 7.0, 130.0, 30.0); 
tabs.selectedSegmentIndex = 0; 
[self.navigationController.navigationBar addSubview:tabs]; 
[tabs release]; 

Но когда пользователь возвращается в иерархии UINavigationController сегментированного контроллер остается на панели навигации. Как я могу избавиться от него? Или я делаю что-то принципиально неправильное?


EDIT

После предложения Алекса, я propertized язычков и попробовал:

NSArray *tabItems = [NSArray arrayWithObjects:@"FAQs", @"Terms", nil]; 
    self.tabs = [[UISegmentedControl alloc] initWithItems:tabItems]; 

, но я не уверен, что это хорошая идея, чтобы Alloc собственности;

И я использую

[self.tabs removeFromSuperview]; 

в моем viewWillDisappear. Этого достаточно?

ответ

2

Сохраните ссылку на сегментированный элемент управления в вашем контроллере вида (определите tabs как свойство в файле заголовка контроллера представления).

Переопределите метод контроллера -viewWillDisappear: контроллера вида и удалите сегментированный элемент управления с панели навигации там, используя метод управления -removeFromSuperview.

EDIT

Вы бы еще alloc-init ваш сегментированный контроль tabs в -viewDidLoad. Вам просто нужно настроить свойство удержания для tabs в заголовке контроллера вашего вида и переместить оператор управления release в метод dealloc контроллера вида.

Прочтите раздел «Свойства» этого Objective-C tutorial для ознакомления с информацией о свойствах и способах их настройки.

Путь переопределить метод заключается в следующем:

- (ReturnClass) methodNameToOverride:args { 
    [super methodNameToOverride:args]; 
    // your code goes here... 
} 

В случае -viewWillDisappear:, этот метод вызывается, когда ваш контроллер представления о исчезнуть, например, когда он получает выталкивается навигационный стек , Это отличное место, чтобы поместить код, который управляет очистку View-Controller конкретных элементов, как ваше сегментированным управление:

- (void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [tabs removeFromSuperview]; 
} 

EDIT 2

Если ваше имущество устанавливаются следующим образом:

@property (nonatomic, retain) UISegmentedControl *tabs; 

тогда вы собираетесь retain что вы установить self.tabs равным.

Ваш код здесь:

self.tabs = [[UISegmentedControl alloc] initWithItems:...]; 

создает утечку памяти, потому что вы сохранить этот объект: [[UISegmentedControl alloc] init] - но вы никогда не выпускать [[UISegmentedControl alloc] init] себя. Это плохо.

Вместо этого используйте autorelease на правой стороне, т.е .:

self.tabs = [[[UISegmentedControl alloc] initWithItems:...] autorelease]; 

Свойство tabs сохраняет свою собственную ссылку на инициализируется сегментирован управления. Этот инициализированный сегментированный элемент управления сам выпускается должным образом в какой-то более поздний момент. Так больше утечек памяти.

+0

Спасибо. как бы настроить сегментированный элемент управления без выделения/инициализации? И можете ли вы дать мне строку кода, необходимую в методе viewWillDisappear. Спасибо – cannyboy

+0

сменил вопрос – cannyboy

+0

См. Правки. –

0

Еще лучше, установите UISegmentedControl, владеющий навигационным интерфейсом UIViewControllerItem.titleView, в UISegmentedControl.

-(void) viewDidLoad { 
    if(!mySegmentedControl) { 
     // initialize the UISegmentedControl 
     ... 
    } 

    self.navigationItem.titleView = mySegmentedControl; 
} 

не требует ручного удаления UISegmentedControl или любого другого UIView по этому вопросу требуется, за исключением, конечно, высвобождая при владеющем UIViewController является dealloc'ed. Кроме того, чтобы быть «хорошим гражданином памяти», вы можете установить свое свойство на нуль в -viewDidUnload.

Вы также можете настроить левую и правую кнопки barButtonItems объекта навигации UIViewController.

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