在一个屏幕多TableViews

我有计划有两个TableViews和其他一些项目中的一个UIViewController。我正在使用其他屏幕无论TableViews,所以我想使他们作为独立的和可重复使用成为可能。 其中一个TableViews被称为给messageManager(一个UITableView),这显示了我的ChatHistory。

我想了解,如果我的做法是。 [编辑9/2与正确的代码,使这种方法工作]

一种方法是使用一个表有2个不同的部分,然后在委托方法使用条件语句,看看哪些部分是并采取相应行动。

这种方法的问题是可用性。 我想轻松地重用我TableViews在一个或另一个TableView中可能存在或不存在其他看法。 此外,我想数据源在整个应用生命周期的存在而不管控制器被实例化或活动。

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

着眼于TableViews之一,我ChatTableView。

在我的AppDelegate有它实现的UITableViewDelegate&UITableViewDataSource型ChatHistory的chatHistory属性。

// 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的终止)每类访问

如何创建Objective-C的一个Singleton类

你并不需要做一个视图控制器你的tableview数据源或委派; 任何对象可以被设置。 您可以使用一个单独的费利克斯建议,或任何你想要的其他类结构。 既然你提到你想要的聊天记录到可从任何地方应用,是有意义的提供UITableViewDataSource协议的聊天记录。

至于的UITableViewDelegate,你可以简单地创建一个新的类作为NSObject的一个子类,并实现委托在那里。 确保它的创建,并妥善保留,并在设置(在负载)的委托表格的意见。

我会做这样的:使两个UITableView一个视图控制器第子视图。

每个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
}

我知道这并不两个表视图类非常整齐地分开。 你就必须有控制另外两个视图控制器,每个的tableview视图控制器。

或许人们必须考虑重用和更令人费解的架构(其通常也导致不在可重用性方面执行的所有井的类)的并发症之间的折衷。 这就是为什么我会建议从苹果样本项目的办法。

分类:iphone 时间:2015-03-15 人气:0
本文关键词: iphone,IOS的UITableView
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.330 (s). 10 q(s)