我有一个UIViewController,打算在其中包含两个TableView和其他一些项。
我在其他屏幕上使用的两个TableViews,因此我想使它们尽可能独立和可重用。这些TableViews之一称为messageList(UITableView),它显示了我的ChatHistory。

我想了解我的方法是否可行。 [使用正确的代码编辑9/2,以使此方法有效]

一种方法是使用带有2个不同部分的单个表,然后在委托方法中使用条件语句查看哪个部分是哪个部分并采取相应的措施。

这种方法的问题是可用性。我想在一个或另一个TableView可能存在或不存在的其他视图中轻松重用TableViews。另外,我希望DataSource在应用程序的整个生命周期中都存在,而不管实例化或激活了哪个Controller。

我的方法是将管理表视图的视图控制器与表UITableViewDataSource和UITableViewDelegate实现分开。但是我在执行这项工作时遇到了问题。

专注于TableViews之一,我的ChatTableView。

在我的AppDelegate中,具有ChatHistory类型的chatHistory属性,该属性实现UITableViewDelegate和UITableViewDataSource。

// AppDelegate.h

ChatHistory *chatHistory;
...
@property (nonatomic, retain) ChatHistory *chatHistory;

// ChatHistory.h
#import <Foundation/Foundation.h>

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

@end

// ChatHistory.m-注意此代码,包括自定义单元作为控制器的一部分时正常工作,因此我认为它应该是正确的
#import "ChatHistory.h"
#include "ChatMessage.h"

@implementation ChatHistory
@synthesize nibLoadedCell;   // custom cell design
@synthesize messages;

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
return [messages count];
}

- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section {
return [NSString stringWithFormat:@"Discussion"];

}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"ChatTableCell" owner:self options:nil];
    cell = nibLoadedCell;
    }
    // custom tag order - username; message; future - Avatar; like; dislike
ChatMessage *obj = [messages objectAtIndex:indexPath.row];
UILabel *messageLabel = (UILabel *) [cell viewWithTag:1];
messageLabel.text = obj.message;
UILabel *usernameLabel = (UILabel *)[cell viewWithTag:2];
usernameLabel.text = obj.sender;
return cell;
}

- (void)dealloc {
    if (messages) [messages release];
    [super dealloc];
}
@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];
        ...

最佳答案

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

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

How to create a Singleton class in Objective-C

关于iphone - 单个屏幕中有多个TableView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7277503/

10-13 04:04