0

我建立一個分段控制我的viewDidLoad方法中,像這樣:如何在視圖彈出後從uinavigationcontroller中刪除分段控制器?

NSArray *tabitems = [NSArray arrayWithObjects:@"ONE", @"TWO", nil]; 
UISegmentedControl *tabs = [[UISegmentedControl alloc] initWithItems:tabitems]; 
tabs.segmentedControlStyle = UISegmentedControlStyleBar; 
tabs.frame = CGRectMake(185.0, 7.0, 130.0, 30.0); 
tabs.selectedSegmentIndex = 0; 
[self.navigationController.navigationBar addSubview:tabs]; 
[tabs release]; 

但是,當用戶回到在UINavigationController的層次,分段控制器停留在導航欄上。我將如何擺脫它?或者我在做一些根本性錯誤?


編輯

繼Alex的建議,我propertized標籤和嘗試:

NSArray *tabItems = [NSArray arrayWithObjects:@"FAQs", @"Terms", nil]; 
    self.tabs = [[UISegmentedControl alloc] initWithItems:tabItems]; 

,但我不知道這是對的Alloc屬性是個好主意;

而且我在我viewWillDisappear使用

[self.tabs removeFromSuperview]; 

。夠了嗎?

回答

2

在視圖控制器中保留對分段控件的引用(即將tabs定義爲視圖控制器頭文件中的屬性)。

覆蓋視圖控制器的-viewWillDisappear:方法,並使用控件的-removeFromSuperview方法從導航欄中刪除分段控件。

編輯

你仍然alloc-init您的分段控制tabs-viewDidLoad。您只需在視圖控制器的標題中爲tabs設置retain屬性,並將控件的release語句移動到視圖控制器的dealloc方法。

閱讀此Objective-C tutorial的「屬性」部分,瞭解屬性介紹以及如何設置它們。

重寫的方法,該方法如下:

- (ReturnClass) methodNameToOverride:args { 
    [super methodNameToOverride:args]; 
    // your code goes here... 
} 

-viewWillDisappear:的情況下,該方法被調用時的視圖控制器即將消失,當它被彈出導航堆棧如。這是把代碼管理的視圖 - 控制器 - 特定項目的清理,喜歡你的分段控制的好地方:

- (void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [tabs removeFromSuperview]; 
} 

EDIT 2

如果你的屬性設置如下:

@property (nonatomic, retain) UISegmentedControl *tabs; 

然後你要去retain任何你設置的self.tabs等於。

您的代碼在這裏:

self.tabs = [[UISegmentedControl alloc] initWithItems:...]; 

將創建一個內存泄漏,因爲你保留這個對象:[[UISegmentedControl alloc] init] - 但你永遠不放開[[UISegmentedControl alloc] init]本身。這不好。

相反,在右側使用autorelease,即:

self.tabs = [[[UISegmentedControl alloc] initWithItems:...] autorelease]; 

tabs屬性保留自己的參考初始化分段控制。初始化的分段控制本身在稍後的某個時候會正確釋放。所以沒有更多的內存泄漏。

+0

謝謝。如何在沒有alloc/init的情況下設置分段控制?你能給我viewWillDisappear方法中所需的代碼行嗎?謝謝 – cannyboy 2010-05-18 10:16:27

+0

更改了原始碼 – cannyboy 2010-05-18 10:25:00

+0

請參閱修改。 – 2010-05-18 10:37:54

0

更好的是,將UISegmentedControl擁有的UIViewController的navigationItem.titleView設置爲UISegmentedControl。

-(void) viewDidLoad { 
    if(!mySegmentedControl) { 
     // initialize the UISegmentedControl 
     ... 
    } 

    self.navigationItem.titleView = mySegmentedControl; 
} 

以外,當然,釋放擁有被UIViewController中被dealloc'ed當要求事項無需手動移除UISegmentedControl或任何其他的UIView。另外,要成爲「良好的回憶公民」,您可以將您的財產設置爲-viewDidUnload

您也可以自定義UIViewController的navgiationItem的左右barButtonItems。

相關問題