在我的视图控制器的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:方法它可以工作,但是一旦我隐藏了我的视图并再次重新显示它,分段控件就会重新出现。
有人知道这个问题和/或知道如何解决这个问题吗?看起来很奇怪。
答案 0 :(得分:2)
我的大部分代码对我来说都很好,从viewDidLoad
或loadView
方法调用时,一切都应该有效。
但是,当您使用NavigationController中包含的工具栏时,工具栏项在ViewController而不是工具栏本身上设置。所以替换这一行:
[[[self navigationController] toolbar] setItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES];
有了这个:
[self setToolbarItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES];
您还需要添加以下行:
[flexSpace release];
答案 1 :(得分:0)
您确定此代码应该在loadView中吗?检查UIViewController docs:loadView用于完全以编程方式构建视图控制器的视图 - 如果实现loadView,则不会从nib加载任何内容。该代码应该在viewDidLoad中吗?我发现你甚至没有在你的loadView方法中创建和分配主UIView - 你通常希望看到它,例如:
self.view = [[[UIView alloc] init] autorelease];
如果 意味着实现loadView,就像你一样,你应该添加上面一行,将主视图分配到方法的顶部,而不是以后。
顺便说一下,也许不要打扰使用animated = YES调用[toolbar setItems];没什么意义,我已经看到动画参数的确切值在过去莫名其妙地打破了事情!