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