2014-02-25 43 views
10

有這個控件,我真的很感謝:github link問題是,現在我有一種情況,當我需要打開一行,所有以前的應該關閉,我只能有一個打開的行當時。UITableView控件上的不同行爲

因爲我對xcode不是很有經驗,所以我需要一些信息來說明我應該從哪裏開始以及使代碼按照我現在需要的方式工作的必要步驟。

我設法做一些測試,但不是一個可行的解決方案,這裏是我現在所擁有的:提前

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    NSInteger row = indexPath.row; 

    if (indexPath.section == 0) { 

     NSLog(@"indexPath1 = %i", selectedRow); 

     NSDictionary *d = [self.firstForTable objectAtIndex:indexPath.row]; 

     if([d valueForKey:@"Objects"]) { 
      NSArray *ar = [d valueForKey:@"Objects"]; 

      NSUInteger count = indexPath.row +1; 
      NSMutableArray *arCells = [NSMutableArray array]; 

      for(NSDictionary *dInner in ar) { 
       [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]]; 
       [self.firstForTable insertObject:dInner atIndex:count++]; 
      } 

      [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; 
     } 
     else { 
      NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"name"],[d valueForKey:@"book"]); 
     } 

     if (selectedRow == row) { 
      NSLog(@"selectedRow2 = %i",selectedRow); 

      NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow]; 

      if([d valueForKey:@"Objects"]) { 
       NSArray *ar = [d valueForKey:@"Objects"]; 

       [self miniMizeFirstsRows:ar]; 
      } 

      selectedRow = -1; 
      return; 
     } 

     if (selectedRow >= 0) { 
      NSLog(@"selectedRow3 = %i",selectedRow); 

      NSDictionary *d=[self.firstForTable objectAtIndex:selectedRow]; 

      if([d valueForKey:@"Objects"]) { 
       NSArray *ar = [d valueForKey:@"Objects"]; 

       [self miniMizeFirstsRows:ar]; 
      } 

      selectedRow = row; 
     } 

     selectedRow = row; 
     [tableView beginUpdates]; [tableView endUpdates]; 
    } 


    if (indexPath.section == 1) { 
     NSDictionary *d = [self.secondForTable objectAtIndex:indexPath.row]; 

     if([d valueForKey:@"Objects"]) { 
      NSArray *ar = [d valueForKey:@"Objects"]; 
      BOOL isAlreadyInserted=NO; 

      for (NSDictionary *dInner in ar) { 
       NSInteger index = [self.secondForTable indexOfObjectIdenticalTo:dInner]; 

       isAlreadyInserted = (index > 0 && index != NSIntegerMax); 
       if (isAlreadyInserted) break; 
      } 

      if (isAlreadyInserted) { 
       [self miniMizeSecondsRows:ar]; 
      } 
      else { 
       NSUInteger count = indexPath.row+1; 
       NSMutableArray *arCells = [NSMutableArray array]; 

       for (NSDictionary *dInner in ar) { 
        [arCells addObject:[NSIndexPath indexPathForRow:count inSection:1]]; 
        [self.secondForTable insertObject:dInner atIndex:count++]; 
       } 

       [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; 
      } 
     } 
     else { 
      NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"name"],[d valueForKey:@"book"]); 
     } 
    } 
} 

感謝。

+0

你需要什麼方式?目前還不清楚你的目標是什麼...... – Beppe

+0

在當前的github控件中,你可以自由地打開有許多你喜歡的行,並且它們將保持打開狀態,我需要的是限制tableview打開只有一行時間。如果我打開一行,其他可能打開的行必須自動關閉:) – Bruno

+0

'[tableView deselectRowAtIndexPath:indexPath animated:YES];'你是否使用這條線來取消選擇之前打開的行?如果不是它在哪裏? – JJ86

回答

10

已更新Expandable Rows JSON是您的項目,所有行均可自動收縮工作。

也檢查Expandable Rows,我分叉這個項目,以幫助諾瓦拉和改善它。現在爲所有部分工作,除了嵌套行。

FIRST STEP

跟蹤每個部分開行。當然,這可以使用tabOpened的NSArray來完成多個部分。

@interface RootViewController : UITableViewController { 
    NSInteger tabOpened_1; 
    NSInteger tabOpened_2; 
} 

第二步驟

下一頁初始化那些具有 「-1」 的值,因爲沒有打開的選項卡。

- (void)viewDidLoad 
{ 
    ........ 

    [self.firstForTable addObjectsFromArray:self.firstArray]; 
    tabOpened_1 = -1; 
    [self.secondForTable addObjectsFromArray:self.secondArray]; 
    tabOpened_2 = -1; 
} 

第三步驟

更改didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

     if (indexPath.section==0) { 
      NSDictionary *d=[self.firstForTable objectAtIndex:indexPath.row]; 
      if([d valueForKey:@"produtos"]) { 
       if (tabOpened_1 == -1) { 
        NSLog(@"No tab opened in first section"); 
        tabOpened_1 = indexPath.row; 
       } else if(tabOpened_1 != indexPath.row && tabOpened_1 > indexPath.row){ 
        NSDictionary *d_ = [self.firstForTable objectAtIndex:tabOpened_1]; 
        NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
        [self miniMizeFirstsRows:ar_]; 
        tabOpened_1 = indexPath.row; 
       } 

       NSArray *ar=[d valueForKey:@"produtos"]; 
       BOOL isAlreadyInserted=NO; 

       for(NSDictionary *dInner in ar){ 
        NSInteger index=[self.firstForTable indexOfObjectIdenticalTo:dInner]; 
        isAlreadyInserted=(index>0 && index!=NSIntegerMax); 
        if(isAlreadyInserted) break; 
       } 

       if(isAlreadyInserted) { 
        [self miniMizeFirstsRows:ar]; 
       } else { 
        NSUInteger count=indexPath.row+1; 
        NSMutableArray *arCells=[NSMutableArray array]; 
        for(NSDictionary *dInner in ar) { 
         [arCells addObject:[NSIndexPath indexPathForRow:count inSection:0]]; 
         [self.firstForTable insertObject:dInner atIndex:count++]; 
        } 
        [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; 
       } 

       if (tabOpened_1 == -1) { 
        NSLog(@"No tab opened in first section"); 
        tabOpened_1 = indexPath.row; 
       } else if(tabOpened_1 != indexPath.row && tabOpened_1 < indexPath.row){ 
        NSDictionary *d_ = [self.firstForTable objectAtIndex:tabOpened_1]; 
        NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
        [self miniMizeFirstsRows:ar_]; 
        tabOpened_1 = indexPath.row - [ar_ count]; 
        tabOpened_1 = (tabOpened_1 < 0) ? indexPath.row : tabOpened_1; 
       } 
      } else { 
       NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"nome"],[d valueForKey:@"numeroConta"]); 
      } 
      for (int i=0; i < [[self.rowsPerSection objectAtIndex:indexPath.section] integerValue]; i++) { 
       NSDictionary *d_ = [self.secondForTable objectAtIndex:i]; 
       NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
       [self miniMizeSecondsRows:ar_]; 
      } 
     } 

     if (indexPath.section==1) { 
      if (tabOpened_2 == -1) { 
       NSLog(@"No tab opened in second section"); 
       tabOpened_2 = indexPath.row; 
      } else if(tabOpened_2 != indexPath.row && tabOpened_2 > indexPath.row){ 
       NSDictionary *d_ = [self.secondForTable objectAtIndex:tabOpened_2]; 
       NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
       [self miniMizeSecondsRows:ar_]; 
       tabOpened_2 = indexPath.row; 
      } 

      NSDictionary *d=[self.secondForTable objectAtIndex:indexPath.row]; 
      if([d valueForKey:@"produtos"]) { 
       NSArray *ar=[d valueForKey:@"produtos"]; 

       BOOL isAlreadyInserted=NO; 

       for(NSDictionary *dInner in ar){ 
        NSInteger index=[self.secondForTable indexOfObjectIdenticalTo:dInner]; 
        isAlreadyInserted=(index>0 && index!=NSIntegerMax); 
        if(isAlreadyInserted) break; 
       } 

       if(isAlreadyInserted) { 
        [self miniMizeSecondsRows:ar]; 
       } else { 

        NSUInteger count=indexPath.row+1; 
        NSMutableArray *arCells=[NSMutableArray array]; 
        for(NSDictionary *dInner in ar) { 
         [arCells addObject:[NSIndexPath indexPathForRow:count inSection:1]]; 
         [self.secondForTable insertObject:dInner atIndex:count++]; 
        } 
        [tableView insertRowsAtIndexPaths:arCells withRowAnimation:UITableViewRowAnimationLeft]; 
       } 

       if (tabOpened_2 == -1) { 
        NSLog(@"No tab opened in second section"); 
        tabOpened_2 = indexPath.row; 
       } else if(tabOpened_2 != indexPath.row && tabOpened_2 < indexPath.row){ 
        NSDictionary *d_ = [self.secondForTable objectAtIndex:tabOpened_2]; 
        NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
        [self miniMizeSecondsRows:ar_]; 
        tabOpened_2 = indexPath.row - [ar_ count]; 
        tabOpened_2 = (tabOpened_2 < 0) ? indexPath.row : tabOpened_2; 
       } 
      } else { 
       //NSLog(@"Leave Element:::%@ %@|",[d valueForKey:@"nome"],[d valueForKey:@"book"]); 
      } 

      for (int i=0; i < [[self.rowsPerSection objectAtIndex:indexPath.section] integerValue]; i++) { 
       NSDictionary *d_ = [self.firstForTable objectAtIndex:i]; 
       NSArray *ar_ = [d_ valueForKey:@"produtos"]; 
       [self miniMizeFirstsRows:ar_]; 
      } 
     } 
} 
+0

對不起,遲到的迴應,我有一個問題,在這些行:NSDictionary * d_ = [self.firstForTable objectAtIndex:3];和NSDictionary * d_ = [self.secondForTable objectAtIndex:0];爲什麼值3和0? – Bruno

+0

因爲執行此代碼時,firstForTable/secondForTable的索引3是我們要摺疊的行。分別爲值0,因爲任何行被首先點擊,總是我們想要摺疊第一行。事實上,這不是正確的方式,但它是一個指導,幫助你如何做到這一點併爲你工作。 –

+0

對不起,打擾了另一個問題,但我也在學習過程:)我試圖用下面解析的JSON使用此代碼:https://dl.dropboxusercontent.com/u/30471368/gb。 json我正在使用你的代碼,但是當時tableview並沒有打開一行。你能給我一些關於如何修改代碼的提示嗎?我很抱歉用這樣的問題打擾你。 – Bruno

5

這真的有必要爲你被你控制使用所提?如果不是,我可以向你提出另一個控制。

它是開源的,可在github https://github.com/Augustyniak/RATreeView上使用。 RATreeView是由我和(從你寫的)寫的,它具有你需要的功能。它的公共API是基於UITableView的,所以使用起來非常簡單。它有相當擴展的文檔,可以讓你獲得所有需要的信息。鏈接的github的存儲庫包含示例項目,它顯示瞭如何在自己的項目中開始使用它。

如果你開始使用它,並有一些問題只是問。

相關問題