【问题标题】:How to manage 2 UITableView (master and detail) in 1 UIView如何在 1 个 UIView 中管理 2 个 UITableView(主和详细)
【发布时间】:2012-01-08 12:42:33
【问题描述】:

我想在同一个 UIView 上显示 2 UItableView。重要的是:当我在第一个表 (master) 上选择一行时,我想在第二个表 (detail) 上显示详细信息行。

为了做到这一点,我有:

  • 创建了 1 个 UIViewController 和 2 个 UITableView IB Outlet 属性,与故事板中的 2 个表格链接
  • 在根UIViewController 中为UITableView 设置委托和数据源
  • 为每个 UITableView 创建了 1 个 UITableViewController
  • 为两个代表实现了所有必需的方法

我设法在第一个表中显示数据,但不是在第二个表中,尽管 tableView:numberOfRowsInSection: 对于这两个表是正确的。

当我在调试模式下运行我的应用程序时,我没有看到对详细信息表的 tableView:cellForRowAtIndexPath: 方法的任何调用。

我不明白我错过了什么或哪里错了。任何人都可以帮助我吗?

这是我的部分代码:

RootViewController.h

@interface RootViewController : UIViewController 
{
    MasterTVController * masterController;
    IBOutlet UITableView * masterTV;
    IBOutlet UITableView * detailTV;
}

RootViewController.m

-(void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    if (masterController == nil) {
        masterController = [[masterTVController alloc] init];
    }
    [masterTV setDataSource:masterController];
    [masterTV setDelegate:masterController];
    masterController.view = masterController.tableView;

    [detailTV setDataSource:masterController.detailTVController];
    [detailTV setDelegate:masterController.detailTVController];
}

MasterTVController.h

@interface MasterTVController : UITableViewController <UITableViewDataSource, UITableViewDelegate>
{
    NSMutableArray * masterArray;
    NSMutableArray * detailArray;
    DetailTVController * detailTVController;
}

MasterTVController.m

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        self.detailTVController = [[DetailTVController alloc] init];
        self.detailTVController.view = self.detailTVController.tableView;
    }
    return self;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.detailArray = [[self.masterArray objectAtIndex:indexPath.row] objectForKey:@"details"];
    self.detailTVController.dataArray = detailArray;
    [self.detailTVController.tableView reloadData];
}

【问题讨论】:

  • 发布您的一些代码通常可以帮助人们理解您的问题。
  • 我已经发布了一些代码来展示我想要管理这两个表的方式。
  • 我没有看到任何代码来初始化MasterTVControllerdetailTVController 属性。
  • 我已经为 MasterTVController 添加了 init 方法
  • masterController.tableView 如何连接到情节提要中的主表视图? detailTVController.tableView 如何连接到情节提要中的明细表视图?

标签: objective-c cocoa-touch uitableview storyboard master-detail


【解决方案1】:

我怀疑您的detailTVController.tableView 未设置为detailTV,因此tableView:didSelectRowAtIndexPath: 中的最后一行没有将reloadData 发送到右表视图。尝试在viewDidLoad 中添加这个:

masterController.detailTVController.tableView = detailTV;

您可能还需要以类似的方式设置masterController.tableView

另外,这两行之一似乎可疑:

[menusTV setDataSource:masterController];
[masterTV setDelegate:masterController];

【讨论】:

  • 它已经适用于master 表。今晚我将尝试您的建议,将viewDidLoad 方法修改为RootViewController。但是对我来说有些奇怪; detailTVControllerinitWithStyle 方法中分配和初始化MasterViewController,所以在你建议的代码之后;它会起作用吗?为什么?
  • 我已经修改了你评论的最后一部分的帖子,因为有一个错误。在RootViewController 中,我为RootViewControllerIBOutlet 属性的两个表设置了数据源和委托。这不是一个好方法吗?
  • 你设置detailTV.delegatedetailTV.dataSource的方式很好。
  • 您说“它已经适用于 master 表。”您永远不会在您发布的代码中使用masterController.tableView。你确实使用detailTVController.tableView。您不会在发布的代码中分配给任何一个。不分配detailTVController.tableView 是个问题,因为您使用它。也许你在其他一些你没有发布的代码中使用了masterController.tableView
  • 非常感谢。当我写这部分代码时,我真的不知道我的想法在哪里。我只是在 RootViewCntroller 中修改了方法 viewDidLoad 的代码以使其工作。 masterController.detailTVController.tableView = self.detailTV; 对我来说还是有些奇怪;我没有为主 tableView 做类似的事情,它可以工作:masterController.tableView = self.masterTV;
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多