2011-03-25 41 views
0

由于我是iPhone开发新手,我需要一些建议如何构建我的xib文件,以获得以下(本质上,它应该是非常相似的谷歌地方应用程序)。导航控制器与搜索,地图和表格:如何

我需要一个NavigationController有:

  • 地图搜索功能。
  • TableView搜索功能(理想情况下,搜索应该在地图和TableView之间共享)。
  • 无论源视图(地图或表格)如何显示所选项目的详细信息的一种视图。
  • 地图视图应该有一个按钮来显示列表视图,反之亦然。

我的疑问是,我必须在哪里筑巢?我有一个NavigationController与其视图控制器设置为另一个类与其自己的xib,但我不知道如何继续下去。

我应该创建一个视图与搜索栏和另一个子视图来切换地图和表?或者更好地拥有两个完整的视图,每个视图都有自己的搜索栏?

编辑1

最后我决定实施以下结构:

- TabBarController 
     - LugaresNavController (UINavigationController) 
      - LugaresViewController (UIViewController) 
       - UISearch 
       - SubView (UIView) 
       - MapViewController (UIViewController) 
       - TableViewController (UITableViewController) 

MapViewControllerTableViewController有自己厦门国际银行文件。我想要的是有能力切换到SubView,但我无法做到这一点。

我已分配MapViewControllerTableViewController文件的所有者到它们各自的类中XIB的文件,并且还指定在它们的表示的对应于LugaresViewController的XIB,这是它们的父属性要加载的XIB。

当我运行该应用程序时,我可以看到的是带有NavBar和UISearch的TabBar。 SubView应呈现地图或表格的框架显示空白...

我在这里做错了什么?

+0

我会用mapsubview创建一个TableViewController,一个ViewController。每个人都有'@property(nonatomic,retain)NSString * searchString;'然后您可以从其他视图控制器中设置 – Seega 2011-03-25 12:41:55

+0

SubView的MapViewController和TableViewController子项,上图不正确,还是我误解了结构? SubView是用XIB创建的还是以编程方式创建的? UIViews在未实例化时出现空白,这是程序化视图创建中的常见错误... – diatrevolo 2011-03-31 15:16:41

+0

SubView,MapViewController和TableViewController都在** xib **中表示。他们不是'SubView'的子元素,因为我不能将它们嵌套在接口上,它们只出现在xib的根级别。 – 2011-03-31 15:51:34

回答

1

你的根本问题是你正在让你的不同父母 - 子女层次结构混淆。回顾:MVC是模型,视图和控制器。

iOS有两个不同的父子层次结构:一个用于控制器,一个用于视图。

以下是控制器父子层次结构的一部分:

- TabBarController 
    - LugaresNavController (UINavigationController) 
     - LugaresViewController (UIViewController) 

这意味着LugaresViewController.parentViewController应该LugaresNavController等。

但是下面没有任何意义:

- SubView (UIView) 
    - MapViewController (UIViewController) 
    - TableViewController (UITableViewController) 

视图可以有子视图,但意见不能有subviewcontrollers,

你在做下面的?

- SubView (UIView) 
    - MapViewController.view (UIViewController s view is a subview of Subview) 
    - TableViewController.view (UITableViewController s view is a subview of Subview) 

这是一个视图的父子层次结构。这意味着:

  1. 子视图具有两个子视图(MapViewController.view和TableViewController.view)
  2. MapViewController.parentViewController为零。
  3. MapViewController.navigationController为零。

您可以使用视图transtions & TableViewController.view但不是的viewController过渡MapViewController.view之间切换(如presentModal ...或推或弹出视图控制器...)。

如果这是你想要的,那么你只需要确保你做:

[SubView addSubview: MapViewController.view]; 
[SubView addSubview: TableViewController.view]; 

顺便说一句,子视图是一个可怕的名字。通常我们调用那些containerView或类似的东西。子视图是这样一个重要的概念,你希望能够从该视图的实例中分化子视图的概念。这就像命名你的孩子“孩子”或你的狗“小狗”。

0

您的应用程序类似于我的,我都做了什么:

- TabBarController 
    - TableView 
    - SearchBar 
    - DetailButton ----\ 
    - MapView    \____ push ModalViewController 
    - SearchBar  /
    - DetailButton ----/ 

现在如果有人在我打开相同的看法,但通过其他信息来初始化表视图或地图视图按下按钮它。顺便说一句。什么是LugaresViewController

首先尝试在每个选项卡中仅添加TableViewMapView并查看nib绑定是否正常工作。如果没有,你错过了一些东西,加载名字或类类型。之后,您可以添加SearchBarController并为其提供功能。

0

首先,我不能说我同意你的tabbar应用程序。我认为导航应用程序可能对这个想法更好。然后第一个视图会自动添加导航栏,在UISearchbar下面有一个窗口和一个正常的标签栏。

UIWindow应该包含一个子视图。那将是桌子或地图。当你第一次加载应用程序,并显示,比方说,表,你会怎么做:

[window addSubview:tableViewController]; 

当您切换到的MapView,你会做这样的事情:

[tableViewController removeFromSuperview]; 
[window addSubview:mapViewController]; 

所以,用于切换视图,这是UITabBar发挥作用的地方。确保标签栏有两个部分。胡克的IBAction为到,看起来有点像:

-(IBAction)segmentedControlIndexChanged { 
    switch (segmentedControl.selectedSegmentIndex} { 
     case 0: 
     <call function for removing mapview and adding tableview> 

     case 1: 
     <call function for removing tableview and adding mapview> 

     default: 
     break; 
    } 
} 

最后,但绝对不是最不重要的,这可能是回答您的编辑:请确保您连接所有的连接器在界面生成器(或者,如果您使用XCode 4,只是.xib文件),从.xib到文件所有者。

编辑:当然,在表格/地图上按下的项目的详细视图被推入导航项目中,所以后退按钮会自动创建并在您的详细视图中起作用。

祝你好运!

相关问题