工具栏没有填充

时间:2011-02-24 20:10:05

标签: iphone objective-c uisegmentedcontrol

在我的视图控制器的loadView方法中,我有以下代码:

// Populate self.view and add some views/UI elements

// load Gender selection Bar
self.navigationController.toolbarHidden = NO;
self.navigationController.toolbar.tintColor = [UIColor colorWithRed:0 green:0.37 blue:0.5 alpha:1];

self.genderControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Male", nil), NSLocalizedString(@"Female", nil), nil]];
genderControl.segmentedControlStyle = UISegmentedControlStyleBar;
genderControl.frame = CGRectMake(0, 0, 200, 30);
genderControl.tintColor = [UIColor colorWithRed:0 green:0.37 blue:0.5 alpha:1];
[genderControl addTarget:self action:@selector(changeGender:) forControlEvents:UIControlEventValueChanged];
genderControl.selectedSegmentIndex = GENDER_MALE;

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:genderControl];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

[[[self navigationController] toolbar] setItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES];
[item release];

但是,如果我加载视图,它会显示工具栏,但不会显示分段控件。如果我将我的代码移动到viewWillAppear:方法它可以工作,但是一旦我隐藏了我的视图并再次重新显示它,分段控件就会重新出现。

有人知道这个问题和/或知道如何解决这个问题吗?看起来很奇怪。

2 个答案:

答案 0 :(得分:2)

我的大部分代码对我来说都很好,从viewDidLoadloadView方法调用时,一切都应该有效。

但是,当您使用NavigationController中包含的工具栏时,工具栏项在ViewController而不是工具栏本身上设置。所以替换这一行:

[[[self navigationController] toolbar] setItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES];

有了这个:

[self setToolbarItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES];

此处的文档:http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/setToolbarItems:animated

您还需要添加以下行:

[flexSpace release];

答案 1 :(得分:0)

您确定此代码应该在loadView中吗?检查UIViewController docs:loadView用于完全以编程方式构建视图控制器的视图 - 如果实现loadView,则不会从nib加载任何内容。该代码应该在viewDidLoad中吗?我发现你甚至没有在你的loadView方法中创建和分配主UIView - 你通常希望看到它,例如:

self.view = [[[UIView alloc] init] autorelease];

如果 意味着实现loadView,就像你一样,你应该添加上面一行,将主视图分配到方法的顶部,而不是以后。

顺便说一下,也许不要打扰使用animated = YES调用[toolbar setItems];没什么意义,我已经看到动画参数的确切值在过去莫名其妙地打破了事情!