2012-11-22 99 views
1

在我的應用程序中,用戶根據他/她選擇的單元格更改顯示在tableView中的字段。 (僅供參考...我允許多個單元格選擇。)只要用戶按下後退按鈕,程序就會將選定單元格的textLabel複製到父級viewController的佔位符。保持所選單元格的軌跡

這裏是我的代碼的相關章節:

- (void)willMoveToParentViewController:(UIViewController *)parent 
{ 
int tempCount = 0; 

for (int section = 0; section < 3; section++) 
{ 
    int rowMax; 

    if (section == 0) 
     rowMax = 3; 

    else if (section == 1) 
     rowMax = 5; 

    else if(section == 2) 
     rowMax = 3; 

    for(int row = 0; row < rowMax; row++) 
    { 
     NSIndexPath *tempIndexPath = [NSIndexPath indexPathForRow:row inSection:section]; 

     UITableViewCell *selectedCell = [self.tableView cellForRowAtIndexPath:tempIndexPath]; 

     if(selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
     { 
      NSLog(@"tempCount = %d", tempCount); 
      tempCount++; 

      if (tempCount == 1) 
       chosenFieldsViewController.field0.placeholder = selectedCell.textLabel.text; 

      else if(tempCount == 2) 
       chosenFieldsViewController.field1.placeholder = selectedCell.textLabel.text; 

      else if(tempCount == 3) 
       chosenFieldsViewController.field2.placeholder = selectedCell.textLabel.text; 

     } 
    } 
} 
} 

我意識到,如果的tableView向下滾動選擇細胞後,所選擇的細胞不會出現在parentVC佔位符。從我的分析中我認爲,一旦我向下滾動,單元就從內存中刪除。因此,儘管選擇了這些單元格,但它們未能顯示在父VC上。

如果是這樣,當我向上滾動時,爲什麼看到單元格顯示爲選中狀態?

如果有人能夠建議我如何保持所選單元格的軌道,即使用戶滾動,我將不勝感激。

謝謝。

編輯1

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

if(selectedCell.accessoryType != UITableViewCellAccessoryCheckmark && count<3) 
{ 
    selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    count ++; 
} 

else if(selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
{ 
    selectedCell.accessoryType = UITableViewCellAccessoryNone; 
    count--; 
} 

} 

編輯2

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

NSString *CellIdentifier = [NSString stringWithFormat:@"CellForRow%dSection%d",indexPath.row, indexPath.section]; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
} 

cell.selectionStyle = UITableViewCellSelectionStyleNone; // VERY IMPORTANT 

if (indexPath.section == 0) 
{   
    switch(indexPath.row) 
    { 
     case 0: 
      cell.textLabel.text = @"Class A"; 
      break; 

     case 1: 
      cell.textLabel.text = @"Class B"; 
      break; 

     case 2: 
      cell.textLabel.text = @"Class C"; 
      break; 

     default: 
      break; 
    } 
} 

if(indexPath.section == 1) 
{   
    switch(indexPath.row) 
    { 
     case 0: 
      cell.textLabel.text = @"Class D"; 
      break; 

     case 1: 
      cell.textLabel.text = @"Class E"; 
      break; 

     case 2: 
      cell.textLabel.text = @"Class F"; 
      break; 

     case 3: 
      cell.textLabel.text = @"Class G"; 
      break; 

     case 4: 
      cell.textLabel.text = @"Class H"; 
      break; 

     default: 
      break; 
    } 
} 

if(indexPath.section == 2) 
{ 
    switch (indexPath.row) 
    { 
     case 0: 
      cell.textLabel.text = @"Class I"; 
      break; 

     case 1: 
      cell.textLabel.text = @"Class J"; 
      break; 

     case 2: 
      cell.textLabel.text = @"Class K"; 
      break; 

     default: 
      break; 
    } 
} 

return cell; 
} 
+0

當用戶輸入文字時,您需要這樣做'chosenFieldsViewController.field0.placeholder = selectedCell.textLabel.text;'。否則,您必須以某種形式將其存儲在您的課堂中,以便在滾動時您不會丟失此信息。 – iDev

+0

@ACB:我曾想過你提到的完全相同的解決方案。但它有點棘手。有三個部分,我希望這些字段的顯示順序與他們已選擇的順序相同。如果用戶取消選擇一個字段並從另一個部分選擇一個字段,代碼會變得稍微複雜。爲了幫助你形象化,請參考:http://stackoverflow.com/questions/13460535/label-text-getting-mixed-up。事實上,我仍然感謝你幫助我解決了應用程序的一個主要問題。 :-) –

+0

很高興知道它有幫助。 :)你能分享一些更多的代碼嗎?實現上述目的的唯一方法是將其存儲爲當用戶輸入文本時。如果您可以分享更多的代碼,那麼我們可能會檢查如何克服您面臨的複雜情況。根據我的理解,當用戶輸入某些東西時,您需要將其存儲在數組中,並在用戶取消選擇該單元格時將其刪除。然後在用戶選擇下一個時添加。此數組將始終按用戶選擇的順序排列。 – iDev

回答

1

聲明一個字典作爲,

@property (nonatomic, retain) NSMutableDictionary *selectedTextListDict; 

在viewDidLoad中,

NSMutableDictionary *selectedTextListDict = [[NSMutableDictionary alloc] init]; 

然後改變這些方法如,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if(selectedCell.accessoryType != UITableViewCellAccessoryCheckmark && count < 3) 
    { 
     NSString *rowKeyString = [NSString stringWithFormat:@"%d", indexPath.row]; 
     NSString *sectionKeyString = [NSString stringWithFormat:@"%d", indexPath.section]; 

     NSMutableDictionary *row = [self.selectedTextListDict valueForKey:sectionKeyString]; 
     if (!row) { 
      row = [[NSMutableDictionary alloc] init]; 
     } 
     [row setObject:selectedCell.textLabel.text forKey:rowKeyString]; 
     [self.selectedTextListDict setObject:row forKey:sectionKeyString]; 

     selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
     count ++; 
    } 

    else if(selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
    { 

     NSString *rowKeyString = [NSString stringWithFormat:@"%d", indexPath.row]; 
     NSString *sectionKeyString = [NSString stringWithFormat:@"%d", indexPath.section]; 

     NSMutableDictionary *row = [self.selectedTextListDict valueForKey:sectionKeyString]; 
     [row removeObjectForKey:rowKeyString]; 

     if ([[row allKeys] count] == 0) { 
      [self.selectedTextListDict removeObjectForKey:sectionKeyString]; 
     } else { 
      [self.selectedTextListDict setObject:row forKey:sectionKeyString]; 
     } 

     selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     count--; 
    } 
} 


- (void)willMoveToParentViewController:(UIViewController *)parent 
{ 
    NSArray *selectedTextSectionKeysList = [self.selectedTextListDict allKeys]; 
    NSArray *sortedSelectedTextSectionKeysList = [selectedTextSectionKeysList sortedArrayUsingSelector:@selector(intValue)]; 
    int tempCount = 0; 

    for (NSString *sectionString in sortedSelectedTextSectionKeysList) { 

     NSMutableDictionary *rowDict = [self.selectedTextListDict valueForKey:sectionString]; 

     if (rowDict) { 

      NSArray *selectedTextRowKeysList = [rowDict allKeys]; 
      NSArray *sortedSelectedTextRowKeysList = [selectedTextRowKeysList sortedArrayUsingSelector:@selector(intValue)]; 

      for (NSString *rowString in sortedSelectedTextRowKeysList) { 

       tempCount++; 

       if (tempCount == 1) 
        chosenFieldsViewController.field0.placeholder = [rowDict valueForKey:rowString]; 

       else if(tempCount == 2) 
        chosenFieldsViewController.field1.placeholder = [rowDict valueForKey:rowString]; 

       else if(tempCount == 3) 
        chosenFieldsViewController.field2.placeholder = [rowDict valueForKey:rowString]; 
      } 

     } 
    } 
} 

編輯1:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"GoToModifyFieldsViewController"]) 
    { 
     ModifyFieldsViewController *modifyFieldsViewController = segue.destinationViewController; 
     modifyFieldsViewController.chosenFieldsViewController = self; 

     field0.placeholder = @""; 
     field1.placeholder = @""; 
     field2.placeholder = @""; 

     if(self.selectedTextListDict) 
      self.selectedTextListDict = [[NSMutableDictionary alloc] init]; 
    } 
} 

聲明一個字典中ChosenFieldsViewController:如,

@property (nonatomic, retain) NSMutableDictionary *selectedTextListDict; 

在viewDidLoad中,

selectedTextListDict = [[NSMutableDictionary alloc] init]; 

因此,與其使用self.selectedTextListDict,使用:在ModifyFieldsViewControllerchosenFieldsViewController.selectedTextListDict

+0

我喜歡你的方法,但我們還沒有到那裏:(我將selectedTextList的聲明轉移到了'ChosenFieldsViewController'(parentVC)並將它們替換爲'self。 '使用chosenFieldsViewController(類型的對象:'ModifyFieldsViewController'中聲明的'ChosenFieldsViewController')。如果我一次選擇三個字段,程序工作正常。如果我下次嘗試修改字段,我不能這樣做所以我修改了'prepareForSegue'中的代碼,如果你不介意的話,我可以編輯你的答案來顯示我改變了什麼嗎? –

+0

是的,你可以編輯它並作爲更新添加它,我會接受它。它的工作,因爲我打字整個代碼沒有使用Xcode,因此我期待一些明顯的錯誤和邏輯錯誤謝謝接受。 – iDev

+0

謝謝!順便說一句..我發現了一個錯誤。在編輯你的答案之前讓我先回顧一下。字段出現的順序對我至關重要。但是,如果用戶隨機選擇單元格,則這些字段將按照它們的選擇順序顯示。所以我試圖解決這個問題。 –

0

- 如果是這樣,爲什麼我看時,我向上滾動細胞似乎選擇?

因爲它們會在它們即將出現時自動創建。每次向上或向下滾動時,單元格都會被創建或重用。當它們消失時,它們會被破壞或標記爲重用。

+0

感謝您的回答。那麼,我們如何將這個概念擴展到識別單元格是否被選中,即使它們在tableView中不可見? –

+0

使用必要的元數據在視圖控制器中保留數據結構。一個自定義對象的NSMutableArray應該做的伎倆。 – Minthos

+0

我也試過這個。這使得代碼非常複雜。我必須編寫一個代碼,使用數組中的元素來編寫每一行和每一部分的連接。例如,如果部分== 1,行== 4,objectAtIndex:7應該更新。因此,我不得不寫一長串if-else階梯。所以有一段時間我也調用了「plist」和「NSDictionary」的概念。 –