3

Я создаю программный код UISegmentedControl в режиме контроллера viewDidLoad контроллера вида и добавив его в навигационную панель контроллера вида, назначив его self.navigationItem.titleView.Использование IB для добавления UISegmentedControl в NavigationBar

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

+0

привет! У меня есть одна проблема в этом отношении! У меня есть один segmentControl, и я хочу добавить его в navigationController. Как я могу ? – Chintan

ответ

6

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

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

+0

Престижность во втором абзаце, Эндрю: Мне это нравится еще лучше. Вопрос: Я не понимаю, что вы говорите в первом абзаце. Перетащите * что * точно в область названия? – hkatz

+0

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

0

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

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

Это интересная идея - создание чего-то в IB, оставив ее как подвид чего-то еще, чтобы убедиться, что она доступна позже, а затем захват указателя и исправление иерархии представлений в viewDidLoad.Также есть небольшая заметка в документации, которая removeFromSuperview освобождает приемник, так что вам нужно сначала сохранить его перед тем, как это сделать (и освободить его снова, как только вы назначите его titleView - нет, я заберу это: я бы предположил, что свойство titleView сохраняет семантику и будет делать релиз для вас). – hkatz

1

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

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

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

1

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

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

[[NSBundle mainBundle] loadNibNamed:@"TTCustomSegmentedControl" 
           owner:self 
          options:nil]; 
self.navigationItem.titleView = sortSegmentControl;  
1

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

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;