分段控制在导航控制器中交换ViewControllers

时间:2010-08-10 14:56:08

标签: iphone cocoa-touch view uinavigationcontroller

以下是我的iPhone应用程序的设置:

我有一个UITabBarController,它有4个View Controllers(1个UINavigationController& 3个UIViewControllers)。

Onload我的应用程序默认为UINavigationController,其中有一个分组的UITableView,它提供两个导航选项,当用户点击第一个选项时,相关的UITableViewController(包含位置列表)被压入堆栈。

我想在屏幕上发生的是拥有一个UISegmentedControl,它有两个选项,一个是“List View”(当UIViewController被推送时用户默认看到)和一个允许相关的“Map View”要在地图上显示的地点。

我使用以下代码在NavigationBar上创建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中构建。

我试图这样做的一种方式,但是有效但不觉得它是正确的是通过在我的nib文件中创建两个单独的UIViews(一个用于列表视图,一个用于Map视图),然后使用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”这对我有点困惑,我对Cocoa Touch开发相对较新,所以任何有助于理解这一点的人都会受到赞赏。

由于

3 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题,如果您只是在TableView(已经在UINavigationController堆栈上)和使用此SPECIFIC 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];
 }
}

我会确保阅读人机界面指南,以及视图控制器和导航控制器如何工作的文档。

答案 1 :(得分:1)

我在寻找同一问题的解决方案时遇到了this。似乎对我来说效果很好。

答案 2 :(得分: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;
}