Использование IB для добавления UISegmentedControl в панель навигации - PullRequest
3 голосов
/ 20 июля 2009

В настоящее время я создаю UISegmentedControl программно в методе viewDidLoad контроллера представления и добавляю его в панель навигации контроллера представления, назначая его self.navigationItem.titleView.

Это достаточно просто, но я бы хотел сделать это и в Интерфейсном Разработчике, и до сих пор не смог понять, как это сделать. Google тоже не сильно помог. Может кто-нибудь описать, как это сделать в IB или указать на онлайн-пример? Я был бы очень благодарен. Спасибо, Говард

Ответы [ 5 ]

6 голосов
/ 20 июля 2009

Если у вас в стеке есть весь стек навигации, это довольно просто; Вы можете просто перетащить его в область заголовка, и IB автоматически сделает все правильно.

В противном случае вы можете просто добавить сегментированный элемент управления к пиру (не обязательно к подпредставлению), а затем добавить @property IBOutlet к нему из контроллера представления. Затем в viewDidLoad назначьте его для titleView как обычно. Не забудьте выпустить в dealloc, и вы золотой.

1 голос
/ 04 января 2013

Просто попробуйте это (работает для меня):

UISegmentedControl *mSegmentedControl = [[UISegmentedControl alloc] initWithItems:
                                            [NSArray arrayWithObjects:
                                             @"Segment 1",
                                             @"Segment 2",
                                             nil]];

mSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
mSegmentedControl.tintColor = [UIColor redColor];

[mSegmentedControl setSelectedSegmentIndex:0];


[mSegmentedControl addTarget:self action:@selector(sectionPress:) 
           forControlEvents:UIControlEventValueChanged];

self.navigationItem.titleView = mSegmentedControl;
1 голос
/ 09 июля 2011

Кроме того, вы можете хранить UISegmentedControl, разработанный в IB, в своем собственном NIB. Затем установите FileOwner для класса viewcontroller, который будет использовать экземпляр segmentedControl. В классе viewcontroller объявите segmentedcontrol как свойство IBOutlet и свяжите его с экземпляром в nib.

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

[[NSBundle mainBundle] loadNibNamed:@"TTCustomSegmentedControl"
                              owner:self
                            options:nil];
self.navigationItem.titleView = sortSegmentControl;    
1 голос
/ 13 ноября 2009

В IB вы, конечно, можете просто перетащить вид в середину контроллера навигации, и он будет работать нормально, если он находится только внутри одного элемента навигации.

Однако, если одна и та же ссылка на объект вида перетаскивается в область просмотра заголовка различных элементов навигации, которые в какой-то момент будут помещены в стек контроллеров навигации, у вас возникнут проблемы с исчезновением представления заголовка при переходе назад через стек. Контроллер навигации не слишком доволен ссылками на один и тот же объект, появляющийся по нескольким элементам навигации по некоторым причинам, и он только подбрасывает, когда вы возвращаетесь к представлению с проблемным элементом навигации.

Чтобы обойти это, вы ДОЛЖНЫ явно установить и сбросить объект titleView, когда вы переходите к представлениям, используя общую ссылку на объект представления заголовка. Например, если у вас есть собственная логика за подклассовым представлением, установленным как titleView, который вы хотите создать только один раз.

0 голосов
/ 20 июля 2009

Вы не можете установить свойство titleView в IB, но вы можете создать / настроить элемент управления как дочерний элемент представления вашего контроллера через Interface Builder, а затем в своем методе viewDidLoad удалить его. от вашего взгляда и установите его как titleView:

[segControl removeFromSuperview];
self.navigationItem.titleView = segControl;
...