为UITableView的不同部分设置按钮标记

Dee*_*kur 1 uitableview ios

我列出了来自Web Service的联系人,并将其显示在联系人的"sectionView"tableView中,如屏幕截图所示.

在此输入图像描述

问题是,对于A部分和S部分,我获得了第一行复选框的相同标记值.我已经对一个数组进行了排序并显示在索引表视图中.如何根据indexPath.row获取不同的标记值,而不管显示的部分数量.这是我尝试过的

    In cellForRowAtIndexPath: 
     UIButton *checkBox;
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            checkBox = [[UIButton alloc]initWithFrame:CGRectMake(7, 8, 30, 30)];
        }
        else
        {
            checkBox = [[UIButton alloc]initWithFrame:CGRectMake(15, 13, 30, 30)];
        }

        //int cnt = 0;
        // for (int i = indexPath.section - 1; i > 0 ; i--)
        // {
        //     cnt += [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:i]] count]; //arrayOfCharachters has char 'A' to 'Z'
        // }

        //checkBox.tag = cnt + indexPath.row;

        [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal];
        [checkBox addTarget:self action:@selector(checkBoxClicked:) forControlEvents:UIControlEventTouchUpInside];
        [checkBox setTag:indexPath.row];
        [cell.contentView addSubview:checkBox];
        return cell;
    }

    -(void)checkBoxClicked:(id)sender
    {

        CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableViewContact];
        NSIndexPath *indexPath = [self.tableViewContact indexPathForRowAtPoint:buttonPosition];
        UIButton *tappedButton = (UIButton*)sender;
        NSLog(@"Tag number = %d", [sender tag]);

        if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkBox.png"]])
        {
            [sender  setImage:[UIImage imageNamed: @"checkBoxMarked.png"] forState:UIControlStateNormal];
            if(indexPath != Nil)
            {
                NSString *finalIntId = [mutableArrayOfIds objectAtIndex:indexPath.row]; // store check box ids in mutableArrayOfIds
                NSLog(@"Tagged checked button id = %@", finalIntId);
                [arrayOfIds addObject:finalIntId];
            }
            //NSString *finalIntId = [mutableArrayOfIds objectAtIndex:tappedButton.tag];
            //NSString *finalIntId = [mutableArrayOfIds objectAtIndex:indexPath.row];
        }
        else
        {
            [sender setImage:[UIImage imageNamed:@"checkBox.png"]forState:UIControlStateNormal];
            NSLog(@"UnChecked");
            //[arrayOfIds removeObjectAtIndex:tappedButton.tag];

        }
    }

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    if ([arrayOfCharacters count] == 0)
    {
        return @"";
    }

    return [NSString stringWithFormat:@"%@", [arrayOfCharacters objectAtIndex:section]];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
     NSArray *toBeReturned = [NSArray arrayWithArray:
                                 [@"A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|#"
                                  componentsSeparatedByString:@"|"]];

      return toBeReturned;

}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{


        NSInteger count = 0;

        for (NSString *character in arrayOfCharacters) {

            if ([character isEqualToString:title]) {
                return count;
            }

            count ++;
        }

        return 0;


}



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

        return [arrayOfCharacters count];
        //return 1;

}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{


        //return [mutableArray count];
        return [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:section]] count];

}
Run Code Online (Sandbox Code Playgroud)

san*_*thu 18

您为具有相同行的所有部分设置相同的标记值.
indexPath有两个属性{section,row}.

让我们说A部分有两行,

for row1 -> indexPath.section=0, indexPath.row=0;
for row2->  indexPath.section=0, indexPath.row=1;
Run Code Online (Sandbox Code Playgroud)

让我们说S部分有两排,

for row1 -> indexPath.section=1, indexPath.row=0;
for row2->  indexPath.section=1, indexPath.row=1;
Run Code Online (Sandbox Code Playgroud)

因此,对于A部分的row1和部分S的row1,您要设置相同的标记值,即0.这是您的问题.

尝试设置标签值,如下所示.

button.tag = indexPath.section*1000 +indexPath.row;
Run Code Online (Sandbox Code Playgroud)

检索部分和行时,

NSInteger section = (button.tag)/1000;
NSInteger row = (button.tag)%1000;
Run Code Online (Sandbox Code Playgroud)