0

UITableView現在、チェックマーク付きで選択できるアイテムを開発中です。問題は、一度に選択できるアイテムの数を制限する必要があることです。

例えば:

玉ねぎ、塩、牛乳、オレンジはありません。

この例が示すように、ユーザーが1つのアイテムしか選択できないように制限が必要です。

現在のコード:

-(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;
}

事前に感謝し、私の悪い英語をお詫びします。反対票を投じないでください。疑問がある場合は、私がいつも答えてくれるかどうか尋ねてください。

4

3 に答える 3

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;
    }
}

ディッドセレクト ::

- (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];
    }
}
于 2013-03-18T10:43:29.457 に答える
1

このようにしてみてください。役立つかもしれません。ここで、lastIndexPath はNSIndexPath.h ファイルで宣言された変数です。

- (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; 

        } 

    }   
于 2013-03-18T10:38:37.657 に答える
1

基本的に、この種のビジネス ロジックは、自分でコーディングする必要があります。テーブル ビューを基本的にラジオ ボタンとして使用する場合、単一選択の要件を強制する唯一の方法は、ユーザーが 2 番目の項目を選択しようとする状況をシステムが要求する方法で処理するコードを記述することです。

  • 複数の選択を許可する (ここではそうではありませんが、場合によっては可能です)
  • これと互換性のない他のすべてのチェックを削除し、選択した項目をチェックして、変更したばかりのすべての行を更新するようにテーブル ビューに指示します。
  • なんらかの方法 (点滅、警告、音) でユーザーにエラーを表示します。直接操作を許可できる場合は、ほとんど良い考えではありません。
于 2013-03-18T10:27:29.417 に答える