我们通常都是直接这样使用的
NSLog(@"self.navigationItem.titleView= %@",self.navigationItem.titleView);
NSArray *subviews = self.navigationItem.titleView.subviews;
NSLog(@"self.navigationItem.titleView.subviews= %@",subviews);
segmentedControl = [[MESegmentedControl alloc ]initWithItems:@[@"通知",@"纸条",@"邮件"]];
segmentedControl.frame = CGRectMake(0, 0, 190, 28);
segmentedControl.backgroundColor = [UIColor clearColor];
{
if (_badgeView) [_badgeView removeFromSuperview];
[super removeFromSuperview];

![]()
2013-12-10 17:00:59.578 MESegmentedControl[94933:70b]
NSLog(@"self.navigationItem.titleView= %@",self.navigationItem.titleView);
NSArray *subviews = self.navigationItem.titleView.subviews;
NSLog(@"self.navigationItem.titleView.subviews= %@",subviews);
segmentedControl = [[MESegmentedControl alloc ]initWithItems:@[@"通知",@"纸条",@"邮件"]];
segmentedControl.frame = CGRectMake(0, 0, 190, 28);
segmentedControl.backgroundColor = [UIColor clearColor];
self.navigationItem.titleView = segmentedControl;
不过这样似乎有一个问题,当我们导航到下一级时候,这个segmentedControl 会被调用removeFromSuperview
,一般情况下可能没有问题,但是在一些极端情况下这个就有问题了,如题,我们上面是给UISegmentedControl 做的一个子类,它可以有badge,这个badge是加在该类的superview上的,并且在类中我们重载了此方法
-(void)removeFromSuperview{
if (_badgeView) [_badgeView removeFromSuperview];
[super removeFromSuperview];
}
我们原来是在上面增加了badge视图,可是现在,导航进入了下一级,这个badge视图就消失了,这很显然不是我们想要的
进一步观察了 故事板中,
从中我们可以看出,在故事板中,我们给navigationItem 增加一个视图,都是采用 增加到子视图的模式,并不是采用
[self.navigationItem.titleView addSubview:segmentedControl];
这种方式的
打印一下log,我们也可以看出是这样的
self.navigationItem.titleView= <UIView: 0x8bdca20; frame = (8 5.5; 304 33); autoresize = RM+BM; layer = <CALayer: 0x8bdcc60>>2013-12-10 17:00:59.578 MESegmentedControl[94933:70b]
self.navigationItem.titleView.subviews= (
"<UISegmentedControl: 0x8bdccf0; frame = (20 3; 264 29); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8bdce80>>”
综合上诉结论,我么最好是使用[self.navigationItem.titleView addSubview:segmentedControl];
这种方式的
这种方式,在导航到下一级的时候,并不会被调用 removeFromSuperview
补充,这种情况下,被removeFromSuperview的只是那个self.navigationItem.titleView ,而不是我们的segmentedControl,如果我们没有 self.navigationItem.titleView,那首先还是要先生成一个UIView赋给self.navigationItem.titleView