2012-08-30 22 views
8

私はUITableviewという仕事を表示しており、各行にはタスクの完了を示すチェックボックスがあります。UITableViewCellを選択すると、行の選択とは別に

ユーザーがチェックボックスをタップするとチェックマークが切り替わり、ユーザーがその行をタップすると詳細ビューに切り替わります。後者はただ

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

を使用することにより、簡単ですが、私はaccessoryviewが選択されている場合のみ、チェックボックスを切り替え、選択領域を分離したかった、とセルの残りの部分が選択されている場合にのみ、詳細ビューに入ります。 accessoryviewの中にUIbuttonを追加すると、ユーザーは行を選択し、UIButtonのチェックボックスを押すだけでよいでしょうか?

さらに、ユーザがaccessoryviewに沿ってドラッグすることによってテーブルビューをスクロールしただけの場合はどうでしょうか? TouchUpのUIButtonでこれがトリガーされませんか?

誰でもこれを行う方法に関するアイデアはありますか?御時間ありがとうございます!

答えて

16

どのようにこのデリゲートメソッド内の付属品のタップを管理について:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 

EDIT:

あなたがaccessoryButtonTappedForRowWithIndexPath:方法に対応したカスタムaccessoryViewのためにこのような何かを行うことができます。 cellForRowAtIndexPath:方法で

-

BOOL checked = [[item objectForKey:@"checked"] boolValue]; 
UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"]; 

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
button.frame = frame; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
button.backgroundColor = [UIColor clearColor]; 
cell.accessoryView = button; 

- (void)checkButtonTapped:(id)sender event:(id)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil) 
    { 
    [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableDictionary *item = [dataArray 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]; 
} 
+1

はどのようにあなたのカスタムアクセサリーボタンは、テーブルビューのデリゲートにコールバックするのですか? –

+0

うわー、私はそれを見逃して、ダムの質問にごめんなさい、助けてくれてありがとう!私はそれを与えるだろう、それは私が探していたもののように聞こえる。 – Cody

+1

@CarlVeazey良い点として、ドキュメントには、accessoryButtonTappedForRowWithIndexPathが、開示ボタンのアクセサリタイプに応答すると書かれています。これは、チェックボックスを使用したいので使用するタイプではありません。 詳しい表示には公開ボタンを使い、行の残りの部分をタップして行内の他の場所にチェックマークを表示させることができますが、それは私が望むものではありません。 – Cody

関連する問題