1

我找到了一個UITableView的教程 - 向下瀏覽表格視圖,source code,但我想添加一點點升級。我的目標是在級別0(CurrentLevel == 0)中添加2個分區的分組表格視圖。所以我開始:UITableView - 分組表。 iPhone SDK(Cocoa Touch),Objective C

  1. 從普通到分組更改表視圖樣式(在RootViewController.xib)。 (工作正常)。

  2. 變化在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 
    

    回答

    1
    • 創建第二個陣列浩LD使用@「其他」關鍵的第二部分
    • 數據填充這個數組中viewDidLoad
    • 使用indexPath.section在相關數據源的方法,讓你知道你的表視圖問你哪一部分,並返回對象/相關數組的數量。第一部分爲indexPath.section,第二部分爲1。
    • 無論你正在使用tableDataSource,你需要檢查你是哪個部門,這是無論是在傳遞一個整數(部分)或作爲indexpath的一部分(這樣你就可以通過indexPath.section得到它)。如果你在第0節中,使用tableDataSource,否則如果你在第1節中,使用otherDataSource。
    +0

    感謝您快速的解答。當然,我想是這樣,我知道如何解決這個問題對於普通陣列,但我不知道如何改變通過的.plist文件中提供的數據的方法。再一次:謝謝! – Tom

    +0

    我假設你剛剛添加另一個數組到您的.plist文件下一個不同的密鑰,所以appdelegate.data是2列在裏面,一個用鑰匙字典@「行」和一個用鑰匙@」其他」。這不是這種情況嗎? – jrturton

    +0

    完全一樣,你說... – Tom