【问题标题】:NavigationController with search, map and table: how to带有搜索、地图和表格的 NavigationController:如何
【发布时间】:2025-01-05 18:20:02
【问题描述】:

由于我是 iPhone 开发的新手,我需要一些关于如何构建我的 xib 文件的建议,以便获得以下内容(本质上,它应该与 Google Places 应用程序非常相似)。

我需要一个 NavigationController 与:

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

我的疑问是,我必须在哪里筑巢?我有一个 NavigationController,其 View Controller 设置为另一个具有自己的 xib 的类,但我不知道如何继续。

我应该创建一个带有搜索栏的视图和另一个子视图来在地图和表格之间切换吗?还是最好有两个完整的视图,每个视图都有自己的搜索栏?

编辑 1

最后我决定实现如下结构:

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

MapViewControllerTableViewController 有自己的 xib 文件。我想要的是能够在它们之间切换到SubView,但我做不到。

我已将MapViewControllerTableViewController 文件的所有者分配给它们各自在xib 文件中的类,并且还指定了在对应于LugaresViewController 的xib 中它们表示的属性处加载哪个xib,这是它们的父母。

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

我在这里做错了什么?

【问题讨论】:

  • 我会创建一个 TableViewController,一个带有 mapsubview 的 ViewController。他们每个人都有@property (nonatomic, retain) NSString *searchString;,然后您可以从其他视图控制器中设置
  • MapViewController 和 TableViewController 是 SubView 的子项,上图不正确,还是我对结构的理解有误? SubView 是使用 XIB 创建的,还是以编程方式创建的? UIViews 在未实例化时出现空白,这是以编程方式创建视图的常见错误...
  • SubViewMapViewControllerTableViewController 都在 xib 中表示。它们不是SubView 的子级,因为我不能将它们嵌套在界面上,它们只是出现在 xib 的根级别。

标签: iphone uitableview ios4 uinavigationcontroller mkmapview


【解决方案1】:

您的根本问题是您混淆了不同的父子层次结构。

回顾一下:MVC 是模型、视图和控制器。

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

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

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

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

但是以下没有任何意义:

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

视图可以有子视图,但视图不能有子视图控制器,

你在做以下事情吗?

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

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

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

您可以使用视图转换在 MapViewController.view 和 TableViewController.view 之间切换,但不能使用 viewController 转换(例如 presentModal... 或 push 或 pop ViewController...)。

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

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

顺便说一句,SubView 是一个糟糕的名字。通常我们称那些 containerView 或类似的东西。 子视图是一个非常重要的概念,您希望能够将子视图的概念与该视图的实例区分开来。这就像给你的孩子取名“Kid”或给你的狗取名“Puppy”一样。

【讨论】:

    【解决方案2】:

    你的应用和我的很相似,我做了什么:

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

    现在,如果有人在表格视图或地图视图中按下按钮,我将打开同一个视图,但传递其他信息来初始化它。顺便提一句。什么是LugaresViewController

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

    【讨论】:

      【解决方案3】:

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

      UIWindow 应该包含一个子视图。那可以是表格,也可以是地图。当您第一次加载应用程序并显示表格时,您会这样做:

      [window addSubview:tableViewController];
      

      当您切换到地图视图时,您会执行以下操作:

      [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;
         }
      }
      

      最后但同样重要的是,这可能是您编辑的答案:确保您已连接 Interface Builder 中的所有连接器(或者,如果您使用 XCode 4,则只需 .xib 文件),来自 . xib 到文件所有者的。

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

      祝你好运!

      【讨论】:

        最近更新 更多