【问题标题】:Using IB to add a UISegmentedControl to a NavigationBar使用 IB 将 UISegmentedControl 添加到 NavigationBar
【发布时间】:2010-11-12 03:47:26
【问题描述】:

我目前正在视图控制器的viewDidLoad 方法中以编程方式创建UISegmentedControl,并通过将其分配给self.navigationItem.titleView 将其添加到视图控制器的导航栏中。

这很容易,但我也希望在 Interface Builder 中也能做到这一点,但到目前为止还没有弄清楚如何做。谷歌也没有太多帮助。有人可以描述如何在 IB 中执行此操作或指向在线示例吗?我将不胜感激。 谢谢, 霍华德

【问题讨论】:

  • 你好!我对此有一个问题!我有一个segmentControl,我想将它添加到navigationController 中。我该怎么办?

标签: iphone objective-c interface-builder uisegmentedcontrol


【解决方案1】:

如果您在 nib 中拥有完整的导航堆栈,这实际上非常简单;您只需将其拖入标题区域,IB 就会自动执行正确的操作。

否则,您可以将分段控件添加到 nib(不一定是子视图),然后从您的视图控制器向其添加 @property IBOutlet。然后在viewDidLoad中,像往常一样把它赋值给titleView。记得在 dealloc 中释放,你就是金子。

【讨论】:

  • 感谢第二段,Andrew:我更喜欢这样。一个问题:我不明白你在第一段中所说的内容。将什么准确拖入标题区域?
  • 他的意思是,如果你有一个基于导航的应用程序,在主 window.nib 中你可以将 SegmentedControl 拖到那里,它将持续存在于视图堆栈中。
【解决方案2】:

在 IB 中,您当然可以将视图拖到导航控制器的中间,如果它只是在一个导航项中,它将正常工作。

但是,如果将相同的视图对象引用拖到不同导航项的标题视图区域中,这些导航项将在某个时候被推送到导航控制器堆栈上,那么当您返回时,您将遇到标题视图消失的问题堆栈。由于某种原因,导航控制器对在多个导航项上弹出的同一个对象的引用不太满意,并且只有在您弹出带有麻烦的导航项的视图时才会出现合适的情况。

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

【讨论】:

    【解决方案3】:

    或者,您可以将 IB 中设计的 UISegmentedControl 存储在它自己的 NIB 中。然后将 FileOwner 设置为将使用 segmentedControl 实例的 viewcontroller 类。在 viewcontroller 类中,将 segmentedcontrol 声明为 IBOutlet 属性并将其链接到 nib 中的实例。

    使用设计的实例剩下的就是调用:

    [[NSBundle mainBundle] loadNibNamed:@"TTCustomSegmentedControl"
                                  owner:self
                                options:nil];
    self.navigationItem.titleView = sortSegmentControl;    
    

    【讨论】:

      【解决方案4】:

      试试这个(对我有用):

      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;
      

      【讨论】:

        【解决方案5】:

        您不能在 IB 中设置 titleView 属性,但您可以通过 Interface Builder 将控件创建/设置为控制器视图的子视图,然后在您的 viewDidLoad 方法中将其删除从您的视图并将其设置为titleView:

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

        【讨论】:

        • 这是一个有趣的想法——在 IB 中创建一些东西,将其作为其他东西的子视图只是为了确保以后可以访问它,然后抓住指针并在 viewDidLoad 中修复视图层次结构。文档中还有一个有趣的小注释,即 removeFromSuperview 释放接收器,因此您需要先保留它,然后再执行此操作(并在将其分配给 titleView 后再次释放它 - 不,我收回:我会假设titleView 属性具有保留语义并将为您执行释放)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-26
        • 2014-01-18
        • 2012-01-17
        • 2015-12-31
        • 2012-06-19
        相关资源
        最近更新 更多