选中标记单选

时间:2013-03-18 10:17:37

标签: iphone ios objective-c uitableview

我目前正在开发一个UITableView,其中包含带有复选标记的选项。 问题是我需要对一次选择的项目进行限制。

例如:

没有洋葱,没有盐,是牛奶,没有橙子。

如本例所示,我需要一个限制,以便用户只能选择一个项目。

当前代码:

-(void)checkButtonPressed:(id)sender event:(id)event {
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self.myTableView];
    indexP = [self.myTableView indexPathForRowAtPoint: currentTouchPosition];

    NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
    //MasterCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"MasterCell"];
    item = [arrayData objectAtIndex:indexP.row];

    if (indexP != nil) {
        [self tableView: self.myTableView accessoryButtonTappedForRowWithIndexPath:indexP];
    }

    [self.myTableView reloadData]; 
}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    NSMutableDictionary *item = [arrayData objectAtIndex:indexPath.row];

    BOOL checked = [[item objectForKey:@"checked"] boolValue];

    [item setObject:[NSNumber numberWithBool:!checked] forKey:@"checked"];

    UITableViewCell *cell = [item objectForKey:@"cell"];
    UIButton *button = (UIButton *)cell.accessoryView;

    UIImage *newImage = (checked) ? [UIImage imageNamed:@"unchecked.png"] : [UIImage imageNamed:@"checked.png"];
    [button setBackgroundImage:newImage forState:UIControlStateNormal];

    NSLog(@"accessoryButtonTappedForRowWithIndexPath____");
}

我的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSMutableDictionary *item = [arrayData objectAtIndex:indexPath.row];
    UILabel *nomeLabel = (UILabel *)[cell viewWithTag:2];

    UIButton *btnCheck = (UIButton *)[cell viewWithTag:3];
    BOOL checked = [[item objectForKey:@"checked"] boolValue];
    UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"];
    [btnCheck setBackgroundImage:image forState:UIControlStateNormal];

    nomeLabel.text = [item valueForKey:@"nome"];
    nomeLabel.textColor = [UIColor blackColor];
    [btnCheck addTarget:self action:@selector(checkButtonPressed:event:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

提前致谢并抱歉我的英语不好,请不要投票,只要问你是否有任何疑问我总是在回答。

3 个答案:

答案 0 :(得分:2)

试试这个::

.h文件,

@property(nonatomic, retain) NSIndexPath *lastIndexPath;

.m文件,

int oldRow, newRow;

表格方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier = @"customCell";
    customCell *cell = (customCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
    if (cell == nil)
    {
        NSArray *nib;
        nib= [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil];
        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[customCell class]])
                cell = (customCell *)oneObject;

        newRow = [indexPath row];
        oldRow = [[self lastIndexPath] row];


        cell.accessibilityViewIsModal = (newRow == oldRow && lastIndexPath != nil) ? NO : YES;

        if(cell.accessibilityViewIsModal == NO)
            cell.imgCheck.image = [UIImage imageNamed:@"Checkbox_Checked_New.png"];
        else
            cell.imgCheck.image = [UIImage imageNamed:@"Checkbox_Unchecked_New.png"];

        return cell;
    }
}

DidSelect ::

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    newRow = [indexPath row];
    oldRow = [[self lastIndexPath] row];

    //Check Mark Feature
    if (newRow != oldRow)
    {
        customCell *newCell = (customCell *)[tableView cellForRowAtIndexPath:indexPath];
        newCell.imgCheck.image = [UIImage imageNamed:@"Checkbox_Checked_New.png"];

        customCell *oldCell = (customCell *)[tableView cellForRowAtIndexPath:lastIndexPath];
        oldCell.imgCheck.image = [UIImage imageNamed:@"Checkbox_Unchecked_New.png"];

        [self setLastIndexPath:indexPath];
    }
    else
    {
        customCell *newCell = (customCell *)[tableView cellForRowAtIndexPath:indexPath];
        newCell.imgCheck.image = [UIImage imageNamed:@"Checkbox_Checked_New.png"];

        [self setLastIndexPath:indexPath];
    }
}

答案 1 :(得分:1)

基本上,对于这种业务逻辑,您必须自己编写代码。当使用表视图作为基本单选按钮时,强制执行单选的要求的唯一方法是编写代码来处理用户尝试以系统需要的方式选择第二项的情况:

  • 允许多项选择(这里不是这种情况,但在某些情况下可能会这样)
  • 删除与此不兼容的所有其他检查,检查所选项目,并告诉表格视图刷新刚刚更改的所有行
  • 以某种方式向用户呈现错误(眨眼,警报,声音) - 当您可以允许直接操作时,几乎不是一个好主意。

答案 2 :(得分:1)

尝试这样可能对你有帮助,这里lastIndexPath是在.h文件中声明的NSIndexPath变量。

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

        UITableViewCell* Cell = [tableView cellForRowAtIndexPath:indexPath]; 
        int new = [indexPath row]; 
        int old = (lastIndexPath != nil) ? [lastIndexPath row] : -1; 

        if(new != old) 
        { 
            Cell.accessoryType = UITableViewCellAccessoryCheckmark; 
            UITableViewCell* oldCell = [tableView cellForRowAtIndexPath:lastIndexPath]; 
            oldCell.accessoryType = UITableViewCellAccessoryNone;
           lastIndexPath = indexPath; 

        } 

    }