我目前正在以UISegmentedControl
编程方式在视图控制器的viewDidLoad
方法中创建一个,并将其添加到视图控制器的导航栏中,方法是将其分配给self.navigationItem.titleView
.
这很容易,但我也希望能够在 Interface Builder 中做到这一点,但到目前为止还没有弄清楚如何做。谷歌也没有太多帮助。有人可以描述如何在 IB 中执行此操作或指向在线示例吗?我将不胜感激。谢谢,霍华德
我目前正在以UISegmentedControl
编程方式在视图控制器的viewDidLoad
方法中创建一个,并将其添加到视图控制器的导航栏中,方法是将其分配给self.navigationItem.titleView
.
这很容易,但我也希望能够在 Interface Builder 中做到这一点,但到目前为止还没有弄清楚如何做。谷歌也没有太多帮助。有人可以描述如何在 IB 中执行此操作或指向在线示例吗?我将不胜感激。谢谢,霍华德
如果您在 nib 中有整个导航堆栈,那实际上很容易;您只需将其拖入标题区域,IB 就会自动执行正确的操作。
否则,您可以将分段控件添加到笔尖(不一定是子视图),然后@property IBOutlet
从您的视图控制器中添加一个。然后在viewDidLoad中,像往常一样把它赋值给titleView。记得在 dealloc 中释放,你是金子。
试试这个(对我有用):
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;
或者,您可以将UISegmentedControl
设计的 IB 存储在它自己的 NIB 中。然后将 FileOwner 设置为将使用 segmentedControl 实例的 viewcontroller 类。在 viewcontroller 类中,将 segmentedcontrol 声明为 IBOutlet 属性并将其链接到 nib 中的实例。
使用设计的实例剩下的就是调用:
[[NSBundle mainBundle] loadNibNamed:@"TTCustomSegmentedControl"
owner:self
options:nil];
self.navigationItem.titleView = sortSegmentControl;
在 IB 中,您当然可以将视图拖到导航控制器的中间,如果它只是在一个导航项中,它将正常工作。
但是,如果将相同的视图对象引用拖到不同导航项的标题视图区域中,这些导航项将在某个时候被推送到导航控制器堆栈上,当您返回堆栈时,您将遇到标题视图消失的问题。由于某种原因,导航控制器对在多个导航项上弹出的同一个对象的引用不太满意,并且只有在您弹出带有麻烦的导航项的视图时才会出现合适的情况。
要解决此问题,您必须在使用共享标题视图对象引用导航到视图时显式设置和取消设置 titleView 对象。例如,如果您在子类视图后面有自定义逻辑设置为您只想实例化一次的 titleView。
您不能titleView
在 IB 中设置属性,但您可以通过 Interface Builder 创建/设置控件作为控制器视图的子视图,然后在您的viewDidLoad
方法中,将其从视图中删除并将其设置为 titleView :
[segControl removeFromSuperview];
self.navigationItem.titleView = segControl;