UITableView - 分组表。 iOS(可可触摸)、Objective-C
我找到了 UITableView – 向下钻取表视图的教程,源代码,但我想添加一些升级。我的目标是添加 0 级(CurrentLevel == 0)中包含 2 个部分的分组表视图。所以我开始:
将表视图样式(在 RootViewController.xib)从“普通”更改为“分组”。 (工作正常)。
RootViewController.m 的更改:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1;
将
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
- 新键添加到 data.plist 中,命名为:Other。
之后,CurrentLevel 0 返回 2 个部分,其中 objectForKey:@"Rows" 具有相同的数据。我不知道如何更改
-(void)viewDidLoad,
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
从 data.plist 为我的新键 @"Other" 加载数据的方法,其中键 @"Other" 表示 CurrentLevel 0 表视图中表的第二部分。
这是以下源代码:
DrillDownAppAppDelegate.h
//
// DrillDownAppAppDelegate.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface DrillDownAppAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
NSDictionary *data;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSDictionary *data;
@end
DrillDownAppAppDelegate.m
//
// DrillDownAppAppDelegate.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "DrillDownAppAppDelegate.h"
#import "RootViewController.h"
@implementation DrillDownAppAppDelegate
@synthesize window;
@synthesize navigationController;
@synthesize data;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"data.plist"];
NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
self.data = tempDict;
[tempDict release];
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Save data if appropriate
}
- (void)dealloc {
[data release];
[navigationController release];
[window release];
[super dealloc];
}
@end
RootViewController.h
//
// RootViewController.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController {
NSArray *tableDataSource;
NSString *CurrentTitle;
NSInteger CurrentLevel;
}
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@end
RootViewController.m
//
// RootViewController.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "RootViewController.h"
#import "DrillDownAppAppDelegate.h"
#import "DetailViewController.h"
@implementation RootViewController
@synthesize tableDataSource, CurrentTitle, CurrentLevel;
- (void)viewDidLoad {
[super viewDidLoad];
if(CurrentLevel == 0) {
//Initialize our table data source
NSArray *tempArray = [[NSArray alloc] init];
self.tableDataSource = tempArray;
[tempArray release];
DrillDownAppAppDelegate *AppDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];
self.navigationItem.title = @"Zvolte trasu";
}
else
self.navigationItem.title = CurrentTitle;
}
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.tableDataSource count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell...
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
cell.textLabel.text = [dictionary objectForKey:@"Title"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIImage *rowImage = [UIImage imageNamed:[dictionary objectForKey:@"Image"]];
cell.imageView.image = rowImage;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the dictionary of the selected data source.
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];
if([Children count] == 0) {
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
}
else {
//Prepare to tableview.
RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = Children;
[rvController release];
}
}
- (void)dealloc {
[CurrentTitle release];
[tableDataSource release];
[super dealloc];
}
@end
编辑:
我的尝试:
RootViewController.h
//
// RootViewController.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController {
NSArray *tableDataSource;
NSArray *otherDataSource;
NSString *CurrentTitle;
NSInteger CurrentLevel;
}
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSArray *otherDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@end
RootViewController.m
//
// RootViewController.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "RootViewController.h"
#import "DrillDownAppAppDelegate.h"
#import "DetailViewController.h"
@implementation RootViewController
@synthesize tableDataSource, otherDataSource, CurrentTitle, CurrentLevel;
- (void)viewDidLoad {
[super viewDidLoad];
if(CurrentLevel == 0) {
//Initialize our table data source
NSArray *tempArray = [[NSArray alloc] init];
self.tableDataSource = tempArray;
self.otherDataSource = tempArray;
[tempArray release];
DrillDownAppAppDelegate *AppDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];
self.otherDataSource = [AppDelegate.data objectForKey:@"Other"];
self.navigationItem.title = @"Root";
}
else
self.navigationItem.title = CurrentTitle;
}
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
}
// Customize the number of rows in the table view.
//Not sure about this. When I select some cell from section 1, what will appear at didSelectRowAtIndexPath?
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(section == 0 && CurrentLevel == 0)
return [self.tableDataSource count];
if(section == 1 && CurrentLevel == 0)
return [self.tableDataSource count];
else
return [self.tableDataSource count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if(section == 0 && CurrentLevel == 0)
return nil;
else
return nil;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell... don't know how.
//here is only tableDataSource
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.section];
cell.textLabel.text = [dictionary objectForKey:@"Title"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIImage *rowImage = [UIImage imageNamed:[dictionary objectForKey:@"Image"]];
cell.imageView.image = rowImage;
return cell;
}
//same problem
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//only tableDataSource
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];
if([Children count] == 0) {
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
}
else {
//Prepare to tableview.
RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = Children;
[rvController release];
}
}
- (void)dealloc {
[CurrentTitle release];
[tableDataSource release];
[otherDataSource release];
[super dealloc];
}
@end
I found a tutorial for a UITableView – Drill down table view, source code, but I would like to add a little upgrade. My goal is to add grouped table view with 2 sections in level 0 (CurrentLevel == 0). So I started with:
Change table view style (at RootViewController.xib) from Plain to Grouped. (Works fine).
Changes at RootViewController.m:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
to
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
- Add new key to data.plist named: Other.
After that CurrentLevel 0 returns 2 sections with same data for objectForKey:@"Rows". I don't know hot to change
-(void)viewDidLoad,
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
methods to load data from data.plist for my new key @"Other", where key @"Other" means 2nd section of the table in CurrentLevel 0 table view.
This is the source code for:
DrillDownAppAppDelegate.h
//
// DrillDownAppAppDelegate.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface DrillDownAppAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navigationController;
NSDictionary *data;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) NSDictionary *data;
@end
DrillDownAppAppDelegate.m
//
// DrillDownAppAppDelegate.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "DrillDownAppAppDelegate.h"
#import "RootViewController.h"
@implementation DrillDownAppAppDelegate
@synthesize window;
@synthesize navigationController;
@synthesize data;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"data.plist"];
NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
self.data = tempDict;
[tempDict release];
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Save data if appropriate
}
- (void)dealloc {
[data release];
[navigationController release];
[window release];
[super dealloc];
}
@end
RootViewController.h
//
// RootViewController.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController {
NSArray *tableDataSource;
NSString *CurrentTitle;
NSInteger CurrentLevel;
}
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@end
RootViewController.m
//
// RootViewController.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "RootViewController.h"
#import "DrillDownAppAppDelegate.h"
#import "DetailViewController.h"
@implementation RootViewController
@synthesize tableDataSource, CurrentTitle, CurrentLevel;
- (void)viewDidLoad {
[super viewDidLoad];
if(CurrentLevel == 0) {
//Initialize our table data source
NSArray *tempArray = [[NSArray alloc] init];
self.tableDataSource = tempArray;
[tempArray release];
DrillDownAppAppDelegate *AppDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];
self.navigationItem.title = @"Zvolte trasu";
}
else
self.navigationItem.title = CurrentTitle;
}
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.tableDataSource count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell...
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
cell.textLabel.text = [dictionary objectForKey:@"Title"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIImage *rowImage = [UIImage imageNamed:[dictionary objectForKey:@"Image"]];
cell.imageView.image = rowImage;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Get the dictionary of the selected data source.
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];
if([Children count] == 0) {
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
}
else {
//Prepare to tableview.
RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = Children;
[rvController release];
}
}
- (void)dealloc {
[CurrentTitle release];
[tableDataSource release];
[super dealloc];
}
@end
Edit:
My attempt:
RootViewController.h
//
// RootViewController.h
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import <UIKit/UIKit.h>
@interface RootViewController : UITableViewController {
NSArray *tableDataSource;
NSArray *otherDataSource;
NSString *CurrentTitle;
NSInteger CurrentLevel;
}
@property (nonatomic, retain) NSArray *tableDataSource;
@property (nonatomic, retain) NSArray *otherDataSource;
@property (nonatomic, retain) NSString *CurrentTitle;
@property (nonatomic, readwrite) NSInteger CurrentLevel;
@end
RootViewController.m
//
// RootViewController.m
// DrillDownApp
//
// Created by iPhone SDK Articles on 3/8/09.
// Copyright www.iPhoneSDKArticles.com 2009.
//
#import "RootViewController.h"
#import "DrillDownAppAppDelegate.h"
#import "DetailViewController.h"
@implementation RootViewController
@synthesize tableDataSource, otherDataSource, CurrentTitle, CurrentLevel;
- (void)viewDidLoad {
[super viewDidLoad];
if(CurrentLevel == 0) {
//Initialize our table data source
NSArray *tempArray = [[NSArray alloc] init];
self.tableDataSource = tempArray;
self.otherDataSource = tempArray;
[tempArray release];
DrillDownAppAppDelegate *AppDelegate = (DrillDownAppAppDelegate *)[[UIApplication sharedApplication] delegate];
self.tableDataSource = [AppDelegate.data objectForKey:@"Rows"];
self.otherDataSource = [AppDelegate.data objectForKey:@"Other"];
self.navigationItem.title = @"Root";
}
else
self.navigationItem.title = CurrentTitle;
}
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
}
// Customize the number of rows in the table view.
//Not sure about this. When I select some cell from section 1, what will appear at didSelectRowAtIndexPath?
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(section == 0 && CurrentLevel == 0)
return [self.tableDataSource count];
if(section == 1 && CurrentLevel == 0)
return [self.tableDataSource count];
else
return [self.tableDataSource count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if(section == 0 && CurrentLevel == 0)
return nil;
else
return nil;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// Set up the cell... don't know how.
//here is only tableDataSource
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.section];
cell.textLabel.text = [dictionary objectForKey:@"Title"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
UIImage *rowImage = [UIImage imageNamed:[dictionary objectForKey:@"Image"]];
cell.imageView.image = rowImage;
return cell;
}
//same problem
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//only tableDataSource
NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
//Get the children of the present item.
NSArray *Children = [dictionary objectForKey:@"Children"];
if([Children count] == 0) {
DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:dvController animated:YES];
[dvController release];
}
else {
//Prepare to tableview.
RootViewController *rvController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:[NSBundle mainBundle]];
//Increment the Current View
rvController.CurrentLevel += 1;
//Set the title;
rvController.CurrentTitle = [dictionary objectForKey:@"Title"];
//Push the new table view on the stack
[self.navigationController pushViewController:rvController animated:YES];
rvController.tableDataSource = Children;
[rvController release];
}
}
- (void)dealloc {
[CurrentTitle release];
[tableDataSource release];
[otherDataSource release];
[super dealloc];
}
@end
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
viewDidLoad
中填充此数组indexPath.section
以便您知道您的表视图正在询问您的哪个部分,并返回相关数组的对象/计数。indexPath.section
对于第一部分将为 0,对于第二部分将为 1。viewDidLoad
using your @"Other" keyindexPath.section
in the relevant datasource methods so that you know which section your table view is asking you about, and return the object / count of the relevant array.indexPath.section
will be 0 for the first section and 1 for the second section.tableDataSource
, you need to check what section you are in. This is either passed in as an integer (section) or as part of the indexpath (so you can get it via indexPath.section). If you are in section 0, use tableDataSource, else if you are in section 1, use otherDataSource.