2009-07-19 43 views
3

我在当前视图控制器的viewDidLoad方法创建一个UISegmentedControl编程,并通过将其分配给self.navigationItem.titleView它添加到视图控制器的导航栏。使用IB到一个UISegmentedControl添加到导航栏

这很容易,但我希望能够在Interface Builder中做到这一点,迄今为止还没有找到解决方法。谷歌也没有太多的帮助。有人可以描述如何在IB中做到这一点,或指出一个在线的例子吗?我会非常感激。 谢谢, 霍华德

+0

你好!我有一个关于这个问题!我有一个segmentControl,我想将其添加到navigationController中。我怎么能够 ? – Chintan 2012-03-13 10:26:10

回答

6

如果你有整个导航堆栈在笔尖,它实际上是很容易的;您可以将其拖入标题区域,IB自动执行正确的操作。

否则,您可以将分段控件添加到笔尖(不一定是子视图),然后从您的视图控制器向其添加@property IBOutlet。然后在viewDidLoad中,将其正常分配给titleView。记得在dealloc中发布,你是金。

+0

第二段的荣誉,安德鲁:我更喜欢那个。一个问题:我不明白你在第一段中的意思。将*什么*完全拖到标题区域? – hkatz 2009-07-20 00:44:44

0

您不能设置在IB的titleView属性,但你可以创建/设置控制为通过界面生成器控制器的观点的一个孩子,然后在你的viewDidLoad方法,从您的视图中删除,并将其设置为titleview的:

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

这是一个有趣的想法 - 在IB中创建一些东西,将其留作其他事物的子视图,以确保其后可以访问,然后抓取指针并修复viewDidLoad中的视图层次结构。removeFromSuperview释放接收器的文档中还有一个有趣的小记录,所以在做这件事之前需要先保留它(并且在将它分配给titleView后再次释放它 - 不,我回过头来看:我会假设titleView属性保留了语义,并会为你发布)。 – hkatz 2009-07-19 20:51:22

1

在IB中,您当然可以将视图拖到导航控制器的中间位置,如果它只在一个导航项中,它将正常工作。但是,如果将相同的视图对象引用拖入不同导航项目的标题视图区域,而这些导航项目在某些时候会被推到导航控制器堆栈上,那么当您返回时,您将遇到标题视图消失的问题通过堆栈。由于某些原因,导航控制器不太满意对多个导航项弹出的同一对象的引用,并且当您用麻烦的导航项弹出回到视图时,它只会引发适合。

要解决这个问题,当您使用共享标题视图对象引用导航到视图时,必须显式设置和取消设置titleView对象。例如,如果您将subclassed视图背后的自定义逻辑设置为titleView,而您只想实例化一次。

1

或者,您可以将IB中设计的UISegmentedControl存储在它自己的NIB中。然后将FileOwner设置为将使用segmentedControl实例的viewcontroller类。在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;