在 UINavigationController 中添加 UISegmentedControl 作为 titleView

Posted

技术标签:

【中文标题】在 UINavigationController 中添加 UISegmentedControl 作为 titleView【英文标题】:Add a UISegmentedControl as the titleView in a UINavigationController 【发布时间】:2013-03-04 10:28:06 【问题描述】:

我正在尝试以编程方式将UISegmentedControl 添加为UINavigationController 中的titleView。但它没有出现。经过进一步调查,我发现如果根据Apple docs 未将leftBarButtonItem 设置为nil,则titleView 属性将被忽略。所以我将它设置为nil,但分段控件仍然没有出现!

下面是我的代码。

- (void)viewDidLoad

    [super viewDidLoad];

    self.navigationItem.leftBarButtonItem = nil;
    UISegmentedControl *statFilter = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Personnal", @"Department", @"Company", nil]];
    [statFilter setSegmentedControlStyle:UISegmentedControlStyleBar];
    self.navigationItem.titleView = statFilter;

我该怎么办?我在这里错过了什么?

谢谢。

编辑

感谢所有回复。但是,它们都不适合我,所以我进行了更深入的研究。这一定是我布置申请的方式。我可能应该早点提到这一点。道歉。

我正在创建的是一个 Storyboard 应用程序。主控制器是UITabBarController。单击某个选项卡时,我想显示UITableViewController。由于您无法在UITableViewController 中显示导航栏,我发现我必须添加UINavigationController 并在其中实现UITableViewController。这就是我的应用的基本外观,

仪表板视图控制器连接到一个继承自 UINavigationController 的类 班级。也许这就是问题所在?

因为我刚刚创建了一个小型测试应用程序,所以将 UIViewController 嵌入到 UINavigationController 中,并在 UIViewController 的 ViewDidLoad 中编写了我在上面的原始问题中发布的代码,并显示了分段控件正好。现在我不知道如何在我的主应用程序中做同样的事情,因为没有其他视图控制器或任何连接到导航控制器的东西。

对不起,如果我让事情变得更糟。如果有什么不清楚的地方请评论。

【问题讨论】:

首先,您可以将UINavigationBarUITableViewController 结合使用。您的UITabBarController 需要包含UINavigationControllers,有关更多信息,请参阅***.com/questions/2339177/… 【参考方案1】:

我猜你必须将 UISegmentedControll 设为 UIBarButtonItem:

更新: 此代码使 SegmentedControll 居中:

- (void)viewDidLoad
    self.title = nil;
    UISegmentedControl *statFilter = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Personnal", @"Department", @"Company", nil]];
    [statFilter setSegmentedControlStyle:UISegmentedControlStyleBar];

    NSMutableArray *buttonArray     = [[NSMutableArray alloc] init];
    UIBarButtonItem *flexibleSpace  = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    [buttonArray addObject:flexibleSpace];
    [buttonArray addObject:[[UIBarButtonItem alloc] initWithCustomView:statFilter]];
    [buttonArray addObject:flexibleSpace];

    self.navigationItem.leftBarButtonItems = buttonArray;
    [buttonArray release];

希望对你有帮助!

【讨论】:

如果我用我的三行代码替换你的四行代码,它就会出现在我的应用程序中... 等一下,我认为有一个小问题。我会尽快给您回复。谢谢【参考方案2】:

使用这个希望对你有帮助

- (void)viewDidLoad

    [super viewDidLoad];
    UIView * navview = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 160,80)];
    self.navigationItem.leftBarButtonItem = nil;
    UISegmentedControl *statFilter = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Personnal", @"Department", @"Company", nil]];
    [navview addSubview:statFilter];
    self.navigationItem.titleView = navview;

【讨论】:

最后一行之前的那个,应该是[navview addsubview:statFilter];吗? 在 .h 文件中创建该 statfilter 以便我们可以在该视图中的任何位置更改图像等...

以上是关于在 UINavigationController 中添加 UISegmentedControl 作为 titleView的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

从嵌入在 UINavigationController 中的一个视图控制器到另一个 UINavigationController

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

关闭 UINavigationController 并呈现另一个 UINavigationController

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

UINavigationController 标题和按钮