以下是我的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开发相对较新,所以任何有助于理解这一点的人都会受到赞赏。
由于
答案 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;
}