我找到了一個UITableView的教程 - 向下瀏覽表格視圖,source code,但我想添加一點點升級。我的目標是在級別0(CurrentLevel == 0)中添加2個分區的分組表格視圖。所以我開始:UITableView - 分組表。 iPhone SDK(Cocoa Touch),Objective C
從普通到分組更改表視圖樣式(在RootViewController.xib)。 (工作正常)。
變化在RootViewController.m:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1;
到
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if(CurrentLevel == 0)
return 2;
else
return 1;
- 添加新鍵data.plist命名:其他。
之後CurrentLevel 0返回具有相同數據的2個部分objectForKey:@「Rows」。我不知道熱改變
-(void)viewDidLoad,
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法從data.plist加載數據爲我的新的關鍵@「其他」,其中key @「其他」是指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
RootViewContro ller.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;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
#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;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
#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... dont 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
感謝您快速的解答。當然,我想是這樣,我知道如何解決這個問題對於普通陣列,但我不知道如何改變通過的.plist文件中提供的數據的方法。再一次:謝謝! – Tom
我假設你剛剛添加另一個數組到您的.plist文件下一個不同的密鑰,所以appdelegate.data是2列在裏面,一個用鑰匙字典@「行」和一個用鑰匙@」其他」。這不是這種情況嗎? – jrturton
完全一樣,你說... – Tom