我们通常都是直接这样使用的
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