0

我已經在我的應用上設置了分組表,並推送到新的視圖工作正常。除了一件事。標題和堆棧佈局都很奇怪。這是故障:iPhone:分組表和導航控制器問題

  1. 我在我的表中有兩個部分。
  2. 當我點擊第一部分的第一行時,它將我帶到正確的視圖,但新視圖的標題是表格第二部分中第一行的名稱。
  3. 反過來,第一部分標題中的第二行是第二部分標題中的第二行。

如果我在根視圖表的第二部分中的第二行挖掘,導航按鈕進入該表的第一第二行。


表第1
行1
行2
行3

表第2
行答:我的表的圖

因此,這裏的
B行
C行


所以,如果我在第3行挖掘,推入視圖的標題是行C.導航按鈕告訴我回去排3,然後在最終結束了根視圖。

下面是我實現文件推觀點:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    //CSS 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"CSS"]) 
    { 
     CSSViewController *css = [[CSSViewController alloc] initWithNibName:@"CSSViewController" bundle:nil]; 
     [css setTitle:@"CSS"]; 
     [self.navigationController pushViewController:css animated:YES]; 
    } 

    //HTML 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"HTML"]) 
    { 
     HTMLViewController *html = [[HTMLViewController alloc] initWithNibName:@"HTMLViewController" bundle:nil]; 
     [html setTitle:@"HTML"]; 
     [self.navigationController pushViewController:html animated:YES]; 
    } 

    //JS 
    if ([[arryClientSide objectAtIndex:indexPath.row] isEqual:@"JavaScript"]) 
    { 
     JSViewController *js = [[JSViewController alloc] initWithNibName:@"JSViewController" bundle:nil]; 
     [js setTitle:@"JavaScript"]; 
     [self.navigationController pushViewController:js animated:YES]; 
    } 

    //PHP 
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"PHP"]) 
    { 
     PHPViewController *php = [[PHPViewController alloc] initWithNibName:@"PHPViewController" bundle:nil]; 
     [php setTitle:@"PHP"]; 
     [self.navigationController pushViewController:php animated:YES]; 
    } 

    //SQL 
    if ([[arryServerSide objectAtIndex:indexPath.row] isEqual:@"SQL"]) 
    { 
     SQLViewController *sql = [[SQLViewController alloc] initWithNibName:@"SQLViewController" bundle:nil]; 
     [sql setTitle:@"SQL"]; 
     [self.navigationController pushViewController:sql animated:YES]; 
    } 

&陣列送進工作臺的數據:

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    arryClientSide = [[NSArray alloc] initWithObjects:@"CSS",@"HTML",@"JavaScript",nil]; 
    arryServerSide = [[NSArray alloc] initWithObjects:@"Objective-C", @"PHP",@"SQL",nil]; 
    // arryResources = [[NSArray alloc] initWithObjects:@"HTML Colour Codes", @"Useful Resources", @"About",nil]; 
    self.title = @"Select a Language"; 
    [super viewDidLoad]; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

任何幫助將是大大讚賞。
傑克

+2

聖內存泄漏,蝙蝠俠! (每次你'alloc/init'一個新的viewController時,你應該在釋放它之後釋放它) – 2010-05-06 18:58:45

+0

@Dave +1 * * batman *! – bddckr 2010-05-06 21:18:53

回答

4

我想你缺少一個if語句來確定用戶點擊哪個部分。請記住,NSIndexPath同時具有行和段屬性。我通常做這樣的事情:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
if (indexPath.section == 0) { 
    // Do something with arryClientSide 
} 
if (indexPath.section == 1) { 
    // Do something with arryServerSide 
} 

我假設你正在使用分組表。

乾杯, -Dan

+0

太棒了,謝謝。 – 2010-05-06 19:53:38

0

丹是正確的,你需要使用indexPath.section變量。它看起來像你的代碼現在的樣子,你實際上在推動2個視圖控制器,因爲你有一系列單獨的if語句,在你點擊「第1行」後會發生以下情況:

isEqual:@「CSS」將返回true ,

推動的CSS視圖控制器,

然後下拉,保持檢查(如果.. isEqual:方法@ 「HTML」)。(如果.. isEqual:方法@ 「的JavaScript」)

然後果然(如果.. isEqual:@「PHP」)也將返回true並推送php視圖控制器。

我不知道你的整個應用程序,但我注意到一個觀察(除了內存泄漏),你有一個視圖控制器/筆尖專用於每種語言..如果視圖控制器有很大不同的行爲/外觀,然後我猜測這就是你必須做的事情,但我會建議試着看看每一個之間有什麼相似之處,看看你是否不能製作一個單獨的「LanguageViewController」,傳遞它應該表示的語言並進行初始化/設置屬性視圖控制器基於此。這可能不適用,但如果這樣做會節省你很多工作!

+0

關於你提到的最後一件事,我只需要一個可以控制每種語言的筆尖?當我創建視圖控制器時,當Xcode爲我創建它們時,我創建了單個的筆尖。然後,我給視圖控制器提供一個數組來創建更多的表。我能夠從plist中提供每種編程語言的數據嗎?那麼我能創建一個導航控制器來控制plist的每個項目嗎? – 2010-05-06 19:51:33

+0

是的,這聽起來像一個情況,你只需要製作一個「LanguageViewController」(和nib),用額外的語言字符串參數創建一個自定義的init函數,然後在init函數中做類似的事情(當然,下面是僞代碼) : if(語言等於「CSS」)從CSS.plist加載數據; else if(語言等於「HTML」)從HTML.plist加載數據; etc .. 只是一個建議,但如果有疑問,對你最重要的是什麼。 – Tom 2010-05-06 20:09:03

+0

對,所以我會簡單地將我的代碼上的所有initWithNibName修改爲新的LanguageViewController nib? – 2010-05-06 20:14:24