2011-02-24 102 views
1

在我的視圖控制器的我的loadView methoad我有以下代碼:工具欄沒有得到填充

// 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

一個小匆匆:你可能會在'self.genderControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocal izedString(@「Male」,nil),NSLocalizedString(@「Female」,nil),nil]];'如果genderControl屬性設置爲複製或保留,您希望將autorelease添加到所有的末尾,否則你將保留計數遞增2,而不是1。 – 2011-02-24 20:20:10

+0

genderControl有一個保留屬性,但它在dealloc方法中釋放,所以保留計數再次正常。雖然謝謝! – Robin 2011-02-24 20:34:55

+0

但是,Simon所指出的行最終將性別控制的保留計數設置爲2(1表示自我=和1表示alloc)。你的dealloc會把它減少到1,而不是0 - 因此是內存泄漏!西蒙是正確的,據我所知。 – occulus 2011-02-24 20:37:55

回答

2

您的大部分代碼對我來說看起來都很好,當從viewDidLoadloadView方法調用時,所有內容都應該可以正常工作。

但是,當您使用NavigationController中包含的工具欄時,工具欄項目在ViewController而不是工具欄本身上設置。這裏

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

文檔:那麼替換此行:

[[[self navigationController] toolbar] setItems:[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]; 
+0

忘了flexSpace的發佈,謝謝!爲什麼我想問我的工具欄sizeToFit?我希望它跨越整個屏幕。此外,是否有任何理由爲什麼我應該把代碼放在viewDidLoad而不是loadView,如果我以編程方式創建viewController?我試圖把代碼放在viewDidLoad中,但它也沒有工作。 – Robin 2011-02-24 20:33:09

+0

@Robin對不起,我沒有仔細閱讀你的問題,看到你正在使用NavigationController.toolbar。我已經更新了我的答案來解決這個問題。使用這個時,不需要sizeToFit。至於使用viewDidLoad與loadView,它應該沒有區別。 – theChrisKent 2011-02-24 21:10:27

+0

現在我明白了,不知道ViewController工具欄項屬性。其實這是一個非常聰明的系統。一切正常,現在,謝謝! – Robin 2011-02-24 23:38:52

0

你確定這段代碼應該在loadView中嗎?檢查UIViewController docs:loadView用於完全以編程方式構建視圖控制器視圖 - 如果實現loadView,則不會從nib中加載任何內容。該代碼應該在viewDidLoad中嗎?我看,你甚至沒有創造和分配你的loadView方法主要UIView的 - 這你通常會看到,例如:

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

如果沒有意味着實施的loadView,因爲你有,您應該添加上面的行,將您的主視圖分配給方法的頂部,而不是稍後。

順便說一句,也許不打擾調用[工具欄setItems]與動畫= YES;沒有太多意義,我已經看到動畫參數的確切價值在過去令人難以置信地打破了事情!

+0

視圖是以編程方式創建的,沒有任何東西從筆尖加載,因爲我不是「界面」構建器的粉絲(到目前爲止)。該視圖在代碼發佈之前設置了幾行,應該使其更清楚。 – Robin 2011-02-24 20:29:27

+0

好的!今後發佈完整的方法可能是明智的做法,因爲它可以避免混淆! – occulus 2011-02-24 20:32:53

+0

其實,我可以建議你編輯你的原始文章,並把你的viewLoad完整的代碼?其他人可能會遇到同樣的問題,這可能有助於解決問題的人。 – occulus 2011-02-24 20:44:46