Как удалить сегментированный контроллер из uinavigationcontroller после появления всплывающих окон? - PullRequest
0 голосов
/ 18 мая 2010

Я строю сегментированный элемент управления в моем методе viewDidLoad, вот так:

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];

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


EDIT

Следуя советам Алекса, я настроил вкладки и попробовал:

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

но я не уверен, стоит ли выделять свойство;

А я пользуюсь

  [self.tabs removeFromSuperview];

по моему мнению исчезнет. Этого достаточно?

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

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

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

EDIT

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

Прочтите раздел «Свойства» этого Обучающего файла Objective-C , чтобы узнать о свойствах и их настройке.

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

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

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

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

РЕДАКТИРОВАТЬ 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 голосов
/ 23 ноября 2010

Еще лучше, установите UISegmentedControl, владеющий UIViewController's navigationItem.titleView, в UISegmentedControl.

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

    self.navigationItem.titleView = mySegmentedControl; 
}

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

Вы также можете настроить левый и правый элементы barButtonItem элемента navgiationItem контроллера UIView.

...