2010-08-10 108 views
2

這裏是我的iPhone應用程序的設置:分段控制來交換ViewControllers在導航控制器

我有了4個視圖控制器(1個UINavigationController的& 3 UIViewControllers)一個的UITabBarController。

Onload我的應用程序默認爲UINavigationController,其中有一個分組的UITableView,它提供了兩個導航選項,當用戶點擊第一個選項時,相關UITableViewController(包含位置列表)被壓入堆棧。

我想在屏幕上發生的事情是讓UISegmentedControl有兩個選項,一個是「列表視圖」(用戶在UIViewController被推入時默認會看到)和一個「地圖視圖」,這將允許相關地點將在地圖上呈現。

我用follwing代碼創建的導航欄的UISegmentedControl:

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:segmentItems]; 
[segmentedControl setSelectedSegmentIndex:0]; 
[segmentedControl setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
[segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged]; 

[[self navigationItem] setTitleView:segmentedControl]; 
[segmentedControl release]; 

這是改變的時候了UISegmented控制將調用方法:

- (void) segmentAction:(id)sender 
{ 
UISegmentedControl *segmentControl = sender; 

if([segmentControl selectedSegmentIndex] == 0) 
{ 
    NSLog(@"LIST VIEW CHOSEN!"); 
} 
else 
{ 
    NSLog(@"MAP VIEW CHOSEN!"); 
} 
} 

所以基本上我的問題是什麼是正確/最好的方式來實現我想要實現的,我不想將控制器推到導航堆棧上,我只是想切換到位(可能與動畫)。所有接口都是在IB中構建的。

一種方法,我試圖做到這一點,但工作,但不覺得它是正確的是通過在我的筆尖文件(一個用於列表視圖和一個用於地圖視圖)中創建兩個單獨的UIViews和然後使用setView:適當的..但我認爲不應該每個這些視圖都有自己的控制器和/或自己的筆尖?

- (void) segmentAction:(id)sender 
{ 
UISegmentedControl *segmentControl = sender; 

if([segmentControl selectedSegmentIndex] == 0) 
{ 
    NSLog(@"LIST VIEW CHOSEN!"); 
    [self setView:listView]; //Declared as an UIView IBOutlet 
} 
else 
{ 
    NSLog(@"MAP VIEW CHOSEN!"); 
    [self setView:mapView]; //Declared as an UIView IBOutlet 
} 
} 

一些半相關的例子,我所遇到使用「removeFromSuperview」和「addSubview」,這已經有所confued我,我是比較新的可可觸摸的發展,因此,任何讓我的頭圍繞這幫助將是讚賞。

感謝

回答

1

有一對夫婦的方式來處理這個問題,如果你只是一個TableView中之間正在進行(即已經是UINavigationController的堆棧),並且與此特定的UITableView去一個MapView,你可以有segmentedControl以模態方式顯示mapviewController,即presentModalViewController:。這在功能上有一些缺點,但如果mapview相對簡單,它可能就是你正在尋找的東西。

另一種實現這種方式(也許是最穩健的方法)的方法是有一個視圖控制器同時處理表視圖和地圖視圖。如果他們具有相同的數據源,這是理想的。

另一種方法是有兩個視圖控制器,分別用於表格視圖和地圖視圖,並在您的segmentAction方法中從字面上在導航控制器堆棧上按下並彈出。 例如:

- (void) segmentAction:(id)sender 
{ 
UISegmentedControl *segmentControl = sender; 

if([segmentControl selectedSegmentIndex] == 0) 
{ 
    NSLog(@"LIST VIEW CHOSEN!"); 
    [self.navigationController popViewControllerAnimated:YES]; 
[self.navigationController pushViewController:listViewController animated:YES]; 
} 
else 
{ 
    NSLog(@"MAP VIEW CHOSEN!"); 
    [self.navigationController popViewControllerAnimated:YES]; 
[self.navigationController pushViewController:mapViewController animated:YES]; 
} 
} 

我會確保閱讀人機界面指南,以及視圖控制器和導航控制器是怎麼工作的文檔。

+0

傑西, 感謝您的快速回復,模態提交不是一個真正的選擇。也許一個視圖控制器是要走的路..這是我用setView做的:在兩個IBOutlets - 只是沒有感覺正確,儘管這兩個視圖應該有自己的控制器...我不認爲彈出/推方法看起來是正確的分段控制,我只是想切換像Youtube應用程序爲「最受歡迎(今日/周/所有)」的意見......所以我想我是在正確的軌道上。謝謝你的評論。 – user416183 2010-08-10 15:21:40

1

我遇到了this,同時尋找相同問題的解決方案。似乎對我來說工作得很好。

0
switch (self.menu.selectedSegmentIndex) 
{ 
    case 0 : 
     // setting text to name label 
     boynamelabel.text=[boysnamearray objectAtIndex:0]; 
     girlnamelabel.text=[girlsnamearray objectAtIndex:0]; 

     // setting text to percent label 
     boyspercentlabel.text=[boyspercentarray objectAtIndex:0]; 
     girlspercentlabel.text=[girlsprecentarray objectAtIndex:0]; 

     // setting image to image view 
     boysimage.image=[UIImage imageNamed:@"boy1.jpeg"]; 
     girlsimage.image=[UIImage imageNamed:@"girl1.jpeg"]; 

     break; 

    case 1: 
     // setting text to name label 
     boynamelabel.text=[boysnamearray objectAtIndex:1]; 
     girlnamelabel.text=[girlsnamearray objectAtIndex:1]; 

     // setting text to percent label 
     boyspercentlabel.text=[boyspercentarray objectAtIndex:1]; 
     girlspercentlabel.text=[girlsprecentarray objectAtIndex:1]; 

     // setting image to image view 
     boysimage.image=[UIImage imageNamed:@"boy2.jpeg"]; 
     girlsimage.image=[UIImage imageNamed:@"girl2.jpeg"]; 

     break; 

    case 2 : 
     // setting text to name label 
     boynamelabel.text=[boysnamearray objectAtIndex:2]; 
     girlnamelabel.text=[girlsnamearray objectAtIndex:2]; 

     // setting text to percent label 
     boyspercentlabel.text=[boyspercentarray objectAtIndex:2]; 
     girlspercentlabel.text=[girlsprecentarray objectAtIndex:2]; 

     // setting image to image view 
     boysimage.image=[UIImage imageNamed:@"boy3.jpeg"]; 
     girlsimage.image=[UIImage imageNamed:@"girl3.jpeg"]; 

     break; 

    default: 
     break; 
} 
+0

如果你解決了這個問題,那將會很有幫助。 – atxe 2012-10-20 15:26:55