[英]UITableView - Grouped Table. iOS (Cocoa Touch), 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;
之后,CurrentLevel 0將為objectForKey:@“ Rows”返回具有相同數據的2個部分。 我不知道改變有多熱
-(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
viewDidLoad
填充此數組 indexPath.section
,以使您知道表視圖詢問您的哪個部分,並返回相關數組的對象/計數。 indexPath.section
對於第一部分將為0,對於第二部分將為1。 tableDataSource
,都需要檢查您所在的節。它可以作為整數(節)或作為索引路徑的一部分(因此可以通過indexPath.section獲取)傳遞。 如果您在第0節中,請使用tableDataSource,否則,如果在第1節中,請使用otherDataSource。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.