带有多个表视图的选项卡式 ios 应用程序
Posted
技术标签:
【中文标题】带有多个表视图的选项卡式 ios 应用程序【英文标题】:Tabbed ios application with multiple table views 【发布时间】:2012-06-25 19:21:28 【问题描述】:我正在使用 XCode 4.2 并在 iPad 5.0 上测试我的构建。
我开始使用 XCode 中的标准选项卡式应用程序构建一个应用程序,然后添加代码以在第一个选项卡内有 2 个 uitableviews。
它编译,但表数据没有加载到视图中。
应用委托.h:
@interface dmbAppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UITabBarController *tabBarController;
@end
AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
UIViewController *viewController1 = [[[dmbFirstViewController alloc] initWithNibName:@"dmbFirstViewController" bundle:nil] autorelease];
UIViewController *viewController2 = [[[dmbSecondViewController alloc] initWithNibName:@"dmbSecondViewController" bundle:nil] autorelease];
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, viewController2, nil];
NSLog(@"Loading first tab view from app delegate...");
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
FirstViewController.h:
@interface dmbFirstViewController : UIViewController
ReservationsTable *reservationsController;
WaitlistTable *waitlistController;
IBOutlet UITableView *reserveTable;
IBOutlet UITableView *waitlistTable;
FirstViewController.m:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"FirstView Controller - View Loading Started");
[reserveTable setDataSource:reservationsController];
[waitlistTable setDataSource:waitlistController];
NSLog(@"FirstView Controller - Loading Table Views..");
[reserveTable setDelegate:reservationsController];
[waitlistTable setDelegate:waitlistController];
reservationsController.view = reservationsController.tableView;
waitlistController.view = waitlistController.tableView;
NSLog(@"FirstView Controller - View Loading Finished");
这两个表都有一个 .h 和 .m 并实现了标准表方法。我还在第一个视图 nib 文件中添加了 2 个表,并将它们链接到文件所有者。
更新: ReserveTable.h:
@interface WaitlistTable : UITableViewController <UITableViewDataSource, UITableViewDelegate>
NSMutableArray *waitlistitems;
ReserveTable.m:
- (void)viewDidLoad
NSLog(@"View Did Load - Wait List Table");
waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
NSLog(@"Inside number of section for Wait List table...");
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSLog(@"Inside numberofRows for Wait List table...");
// Return the number of rows in the section.
return [waitlistitems count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"Inside cell for row at index path for Wait List table...");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// Configure the cell...
cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];
return cell;
想法?
【问题讨论】:
reservationsController 和 waitListController 的代码是什么样的?它们在哪里初始化? 在上面的问题中添加了waitlist控制器的代码。 【参考方案1】:将您的 viewDidLoad
更改为:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
reservationsController = [[ReservationsTable alloc] init];
waitlistController = [[WaitlistTable alloc] init];
NSLog(@"FirstView Controller - View Loading Started");
[reserveTable setDataSource:reservationsController];
[waitlistTable setDataSource:waitlistController];
NSLog(@"FirstView Controller - Loading Table Views..");
[reserveTable setDelegate:reservationsController];
[waitlistTable setDelegate:waitlistController];
NSLog(@"FirstView Controller - View Loading Finished");
基本上,你永远不会初始化你的tableViewControllers
(我猜这是他们两个的名字,我会把他们的名字改成“WaitlistTableViewController”和“ReservationsTableViewController”,但那只是我。)另外,没有必要将 'tableView' 设置为 'view'。
或者更好的是,在您的 dmbFirstViewController
的 init 方法中初始化它们。
或者像这样使用dmbFirstViewController
:
dmbFirstViewController.h:
@interface dmbFirstViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
ReservationsTable *reservationsController;
WaitlistTable *waitlistController;
IBOutlet UITableView *reserveTable;
IBOutlet UITableView *waitlistTable;
NSMutableArray *waitlistitems;
NSMutableArray *reserveitems;
dmbFirstViewController.m:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
waitlistitems = [[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"6",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17",nil] retain];
NSLog(@"FirstView Controller - View Loading Started");
[reserveTable setDataSource:self];
[waitlistTable setDataSource:self];
NSLog(@"FirstView Controller - Loading Table Views..");
[reserveTable setDelegate:self];
[waitlistTable setDelegate:self];
NSLog(@"FirstView Controller - View Loading Finished");
- (void)viewDidAppear:(BOOL)animated
[reserveTable reloadData];
[waitlistTable reloadData];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
NSLog(@"Inside number of section for Wait List table...");
if(tableView == waitlistTable)
//Return sections for waitlistTable
return 1;
else
//Return sections for reservedTable
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if(tableView==waitlistTable)
NSLog(@"Inside numberofRows for Wait List table...");
// Return the number of rows in waitlistTable section.
return [waitlistitems count];
else
// Return the number of rows in reservedTable section.
return [reserveditems count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if(tableView == waitlistTable)
NSLog(@"Inside cell for row at index path for Wait List table...");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// Configure the cell...
cell.textLabel.text = [NSString stringWithFormat:@"1.%@" ,[waitlistitems objectAtIndex:indexPath.row]];
return cell;
else
//Create cell for reservedTable Cell
.....
return cell;
你必须完成关于reservedTable
单元格的部分,我没有那个代码。另外,我猜到了 reservedTable
的 items 数组并没有初始化它。
【讨论】:
我重构了类的名称,并添加了您的代码来初始化它们。还是不行。 我的最后一点建议是在视图出现后尝试重新加载数据。在viewDidAppear:
方法中尝试[reserveTable reloadData]; [waitlistTable reloadData];
dmbFirstViewController
或者,如下所述,使用dmbFirstViewController
作为datasource
和delegate
用于UITableView
s。如果您需要这样做的帮助,我可以发布代码。
我试过 reloadData 还是不行。我认为这些表没有连接到它们的数据源。
好的,你能给我看一些示例代码,让两个表的代码在同一个视图中吗?【参考方案2】:
我认为在您的firstViewController
中您应该推送意见。
假设reserveTable
是你的主表,就这样推吧
[self.view addSubView:reserveTable];
另外,您是否将ReserveTable.h
导入到您的firstViewController
?
如果是,你应该在那里初始化表格。
但我建议将firstViewController
转换为tableViewController
,编辑App Delegat
e 和firstViewController.h
和m,然后从那里初始化表(甚至添加另一个表)。这样会更容易!
【讨论】:
是的,我确实在我的 firstviewcontroller 头文件中导入了可重置类。 如果我想将firstviewcontroller转换为table view controller,我该如何加载两个不同的table呢? 尝试将其更改为tableViewController。只需将您在reserveTable 中的方法放入firstViewController 先用一张桌子试一试,一直在崩溃……正在努力。 感谢 Pheel,您将 firstViewController 转换为 tableViewController 的解决方案有效且更容易!以上是关于带有多个表视图的选项卡式 ios 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 Core Data 的选项卡式应用程序,每个选项卡上都有不同的主从表视图
带有 Xcode 6 的 iOS 8:PSCollectionView 不可滚动且单元格不可使用选项卡式应用程序选择