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にplaceHolderとして表示されないことに気付きました。私の分析から、下にスクロールすると、セルがメモリから削除されると思います。したがって、セルが選択されているにもかかわらず、それらは親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;
}
4

2 に答える 2

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:as、で宣言します

@property (nonatomic, retain) NSMutableDictionary *selectedTextListDict;

viewDidLoadでは、

selectedTextListDict = [[NSMutableDictionary alloc] init];

したがって、を使用するのではなくself.selectedTextListDict、:chosenFieldsViewController.selectedTextListDictinを使用しModifyFieldsViewControllerます。

于 2012-11-23T00:33:54.853 に答える
0

-もしそうなら、上にスクロールしたときにセルが選択されて表示されるのはなぜですか?

表示されるたびに自動的に作成されるためです。上または下にスクロールするたびに、セルが作成または再利用されます。それらが消えると、破壊されるか、再利用のマークが付けられます。

于 2012-11-22T23:52:44.407 に答える