Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在一个屏幕中显示多个表视图_Iphone_Ios_Uitableview - Fatal编程技术网

Iphone 在一个屏幕中显示多个表视图

Iphone 在一个屏幕中显示多个表视图,iphone,ios,uitableview,Iphone,Ios,Uitableview,我有一个UIViewController,我计划在其中包含两个TableView和一些其他项目。 我在其他屏幕上使用的两个表视图,因此我希望使它们尽可能独立和可重用。其中一个表视图称为messageList(UITableView),它显示我的聊天历史记录 我试图了解我的方法是否正确。[使用正确的代码编辑了9/2,以使该方法有效] 一种方法是使用一个包含两个不同部分的表,然后在委托方法中使用条件语句查看哪个部分是哪个部分,并相应地执行操作 这种方法的问题是可用性。我希望在一个或另一个TableV

我有一个UIViewController,我计划在其中包含两个TableView和一些其他项目。 我在其他屏幕上使用的两个表视图,因此我希望使它们尽可能独立和可重用。其中一个表视图称为messageList(UITableView),它显示我的聊天历史记录

我试图了解我的方法是否正确。[使用正确的代码编辑了9/2,以使该方法有效]

一种方法是使用一个包含两个不同部分的表,然后在委托方法中使用条件语句查看哪个部分是哪个部分,并相应地执行操作

这种方法的问题是可用性。我希望在一个或另一个TableView可能存在或不存在的其他视图中轻松重用我的TableView。此外,我希望数据源在应用程序的整个生命周期中都存在,而不考虑实例化或活动的控制器

我的方法是将管理表视图的视图控制器与表UITableViewDataSource和UITableViewDelegate实现分开。但我有一个问题,使这项工作

关注其中一个表视图,我的聊天表视图

在my AppDelegate中,chatHistory类型的chatHistory属性实现了UITableViewDelegate和UITableViewDataSource

//AppDelegate.h

ChatHistory *chatHistory;
...
@property (nonatomic, retain) ChatHistory *chatHistory;
//查特历史

#import <Foundation/Foundation.h>

@interface ChatHistory : NSObject <UITableViewDelegate, UITableViewDataSource> {
    UITableViewCell *nibLoadedCell;
    NSMutableArray *messages;
}
@property (nonatomic, retain) UITableViewCell   *nibLoadedCell;
@property (nonatomic, retain) NSMutableArray    *messages;

@end
//MyViewController.m

- (void)viewDidLoad {   // MAKE SURE TO INITIALIZE viewDidLoad not InitWithNib
        if (!appDelegate.chatHistory)
                appDelegate.chatHistory = [[ChatHistory alloc] init];

        messageList = [[UITableView alloc] initWithFrame:CGRectMake(0, 54, 320, 100) style:UITableViewStylePlain];
        messageList.dataSource = appDelegate.chatHistory;
        messageList.delegate = appDelegate.chatHistory;
        [self.view addSubview:messageList];
        ...

我会这样做:创建一个视图控制器的两个
UITableView
s子视图

datasource
方法的中,您只需区分这两个表,类似于苹果在
UISearchDisplayController
示例中提供的代码。例如:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (tableView == myTableView1) {
    // return appropriate number of rows
  }
  // return appropriate number of rows for the other table view
}
我知道这并不能很好地将两个表视图类分开。必须有一个视图控制器控制两个其他视图控制器,每个表视图一个


也许需要考虑一个更复杂的体系结构的可重用性和复杂性之间的权衡(这通常也会导致那些在可重用性方面表现不好的类)。这就是为什么我推荐Apple示例项目中的方法。

如果您想要一个中央数据存储,可以使用数据创建一个类。 然后将其设置为表视图的数据源,或从
UIViewController
/
UITableViewController
中的数据存储中获取数组(或您获得的任何内容)

如果在
AppDelegate
中初始化数据存储,则可以从所需的每个类访问它(请注意,加载的所有数据将保留在内存中,直到应用程序被iOS终止)


您不需要将视图控制器设置为tableview数据源或委托;可以设置任何对象。您可以按照Felix的建议使用singleton,也可以使用您想要的任何其他类结构。由于您提到希望聊天历史记录在应用程序中的任何位置都可用,因此为该聊天历史记录提供UITableViewDataSource协议是有意义的


至于UITableViewDelegate,您可以简单地创建一个新类作为NSObject的子类,并在那里实现该委托。确保已正确创建和保留它,并将其设置为(加载时)表视图的代理。

。实际上,我认为我的代码不那么复杂或复杂。你知道为什么我的代码不能工作吗?事实上,如果我有一个带有子视图的视图控制器,我发现让这个控制器控制它的所有子视图更容易。我注意到不是你的代码很复杂,而是你的架构。我的架构是多个控制器承载一个公共子视图。我的控制器控制它的所有子视图。我只是在多个屏幕/控制器中重用子视图。在一个屏幕(一个控制器)上,有两个子视图,一个聊天框和一个项目列表。在另一个屏幕(diff controller)上,只存在聊天框。在另一个屏幕(diff controller)上,只存在项目列表。如果我认为这是错误的,我愿意纠正我的想法。谢谢,蒙迪。谢谢,这就是我正在做的。唯一的区别是,我将数据源对象和视图协议结合起来。我已经在这里设置了数据源messageList.datasource=appDelegate.chatHistory;。目前,数据存储在内存中,很可能会保持这种状态。我只需要填充该数据,而不管控制的是哪个控制器。我在第一次使用数据存储时初始化它。我现在的问题实际上更多的是想把委托放到它自己的类中。出于某种原因,虽然我读过的所有文档都说应该没问题。它不工作。我找到了它不工作的原因,正在更新代码。实际上,我需要在ViewDidLoad而不是initFromNib中实例化视图,其中self.view尚未初始化。啊!Tx Andrew,这基本上就是我所做的,但是上面的代码不起作用。它在MyViewController中的[self.view addSubview:messageList]处崩溃;ChatHistory现在充当我的代理和数据源。它同时实现UITableViewDelegate和UITableViewDataSource。它是NSObject的一个子类。上面我展示了如何在InitWithNib中创建它的代码。我感谢大家抽出时间。我有点目瞪口呆,为什么它不起作用。注意:我在一个测试项目中成功地获得了我的工作方法。我会尝试将它重新整合到我原来的项目中,并分享我的发现。感谢Felix和AndrewS对singleton方法的肯定。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  if (tableView == myTableView1) {
    // return appropriate number of rows
  }
  // return appropriate number of rows for the other table view
}