【问题标题】:Adding UIView subview to single table view controller in navigation stack将 UIView 子视图添加到导航堆栈中的单个表视图控制器
【发布时间】:2010-10-15 01:38:12
【问题描述】:

我正在开发一个在导航堆栈中具有三个表视图控制器的应用程序。根视图控制器和第二个 VC 都有工具栏,但我想在第二个视图控制器like this 中添加一个子视图。 (颜色只是为了可视化。)

我想以编程方式添加视图,因为我无法使用 IB 来做到这一点而不会感到头疼。现在,我已经能够通过在第二个视图控制器中绘制一个 UIView 来获得我想要的东西,如下所示:

- (void)viewDidLoad {
      [super viewDidLoad]

      UIView *detailView = [[UIView alloc] initWithFrame:CGRectMake(0, 392, 320, 44)];
      detailView = [UIColor redColor];
      [self.navigationController.view addSubview:detailView];
      [detailView release];
}

这种方法的问题在于,一旦 UIView 在第二个视图控制器中加载,它就会保持加载状态并在第三个和根视图控制器中绘制。我尝试了多种删除 UIView 的方法,包括在 viewDidUnload 中将 detailView 设置为 nil,在 didSelectRowAtIndexPath 中调用 removeFromSuperview(从整个堆栈中删除了视图)。

我也尝试将子视图添加到 self.view,但这会将它推到表格视图的可见区域下方,所以我必须向上滚动才能看到它,当我放手时它会弹回。

显然,将此子视图添加到导航控制器并不是实现我想要的最佳方式,但我不知道从这里去哪里。

【问题讨论】:

    标签: iphone uiview uinavigationcontroller subview tableview


    【解决方案1】:

    正如您已经发现的那样,您绝对不应该进入导航控制器的视图。

    您希望您的SecondViewController 成为实现 UITableViewDelegate 和 UITableViewDataSource 的UIViewController,并且其视图在它自己的主 UIView 中布置了您希望用于固定“页脚”的 UITableView 和 UIView。

    请记住,UITableViewController 最终只是为了方便创建视图控制器,其视图完全由 UITableView 组成。

    无论如何,您可以从this read-only svn repo 浏览它(或svn co),而不是尝试将一堆代码内联在此答案中。

    已编辑(现在不是午夜,直接在答案中添加一些代码/解释):

    对于要推送到需要页脚的导航堆栈的控制器,创建一个新的基于 UIViewController 的类(不要选中模板选择对话框中的“UITableViewController 子类”框)。

    UITableViewUIView 添加实例变量,作为额外的底视图。

    @interface SecondViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
        UITableView* tableView;
        UIView* customFooterView;
    }
    @property (nonatomic,retain) IBOutlet UITableView* tableView;
    @property (nonatomic,retain) IBOutlet UIView* customFooterView;
    @end
    

    在 IB 中,将 UITableView 和 UIView 添加到控制器的现有根视图并根据需要进行布局(如果您的应用可以在横向和纵向中使用,则可能也值得更改自动调整大小参数)。将两个视图连接到“文件所有者”中为它们定义的出口,并确保连接 UITableView's 委托和数据源属性以指向“文件所有者”。

    然后根据您的应用程序实现 UITableViewDelegate 和 UITableViewDataSource 协议。

    如果您想在 IB 中布置整个“页脚”视图,请继续。否则,您可以轻松地以编程方式在 viewDidLoad 中添加项目(并记得在 viewDidUnload 中将其删除)。

    【讨论】:

      【解决方案2】:

      我不喜欢这种方法。您应该将您的表格视图放在另一个视图中,并将您的详细视图放在该视图中。

      尽管如此,我认为您可以在视图控制器的 viewWillDisappear 方法中删除您的视图。我还注意到您没有将您的 detailView 保留为私有变量,您应该这样做,因为您需要在以后删除它时引用它(我仍然想知道您是如何做到的。)

      注意viewDidUnload在视图卸载(即从其控制器释放)的情况下被调用,因此它与导航无关。

      【讨论】:

        【解决方案3】:

        不确定您要寻找哪种行为,但请尝试以下其中一种:

        • 将detailView分配给第二个VC上tableview的tableFooterView属性。

        • 降低table view的高度,将detailView添加到self.view中。

        【讨论】:

        • 页脚视图不起作用,因为子视图需要始终可见,即表格视图应该在它“后面”滚动。
        • 如果我将 subview 添加到 self,然后我将它附加到 tableview,所以它会随着 tableview 滚动。我希望子视图是固定的,就在工具栏的正上方。
        • 好的,VC 是 UITableViewController,而不是 UIViewController。将其更改为 UIViewController 可能更容易,这样您就可以轻松地管理与 tableView 分开的 detailView。
        • 我不得不多次这样做。将您的 vc 更改为从 UIViewController 继承而不是 UITableViewController,添加一个名为 tableView 的 UITableView 类型的属性,然后将现有的表视图连接到 Interface Builder 中的该属性。由于名称冲突,您可能需要调整一些代码,但这应该不会太难。
        猜你喜欢
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        相关资源
        最近更新 更多