我找到了一个UITableView教程-下钻表视图,源代码,但我想添加一点升级。我的目标是在level 0 (CurrentLevel == 0)中添加2个section的分组表视图。
-
将表视图样式(在RootViewController.xib)从Plain更改为Grouped。(没问题)。
-
RootViewController.m:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
- 为数据添加新键。列表名称:Other.
之后CurrentLevel 0为objectForKey:@"行"返回具有相同数据的2节。我不知道该怎么改
-(void)viewDidLoad,
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法从data中加载数据。
为我的新键@"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
- 创建第二个数组来保存第二个部分的数据
- 在
viewDidLoad
中使用@"Other"键填充此数组 - 在相关的数据源方法中使用
indexPath.section
,这样你就知道你的表视图询问你关于哪个部分,并返回相关数组的对象/计数。indexPath.section
在第一部分为0,在第二部分为1。 - 无论你在哪里使用
tableDataSource
,你需要检查你在哪个部分。它要么作为整数(section)传入,要么作为indexpath的一部分传入(因此您可以通过indexpath .section获得它)。如果你在section 0,使用tableDataSource,如果你在section 1,使用otherDataSource。