3

以前にいくつかの投稿を見たことがありますが、まだ回答が得られていないため、より効果的な方法で再度投稿しようとしています。UITableView下の画像のようにチェック/チェック解除機能を使用するにはどうすればよいですか。

これは、任意のセルのボタンをクリックしたときに必要なテーブルです。すべてのセルではなく、ボタンの画像が変更されます。

テーブル

4

5 に答える 5

7

チェック-チェック解除機能の場合、buttonClicked:方法だけでは不十分です。また、スクロールするたびにメソッドが呼び出され、セルが更新されるためcellForRowAtIndexPath:、ボタンが選択されているメソッドまたは選択されていないメソッドに条件を設定します。そして、私はあなたが2つのアクションで2つのボタンを追加しているというあなたの前の質問を見ましたが、ボタンの画像を変更するだけでは良い方法ではありません。cellForRowAtIndexPath:UITableViewcheck-uncheck

だからここに私がこれのために何をするかです-

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
{
    IBOutlet UITableView *tblView;
    NSMutableArray *arrayCheckUnchek; // Will handle which button is selected or which is unselected
    NSMutableArray *cellDataArray; // this is your data array
}

@end

ViewController.mクラスに-

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    arrayCheckUnchek = [[NSMutableArray alloc]init];
    //Assign your cell data array 
    cellDataArray = [[NSMutableArray alloc]initWithObjects:@"cell-1",@"cell-2",@"cell-3",@"cell-4",@"cell-5", nil];

    // setting all unchecks initially
    for(int i=0; i<[cellDataArray count]; i++)
    {
        [arrayCheckUnchek addObject:@"Uncheck"];
    }

}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [cellDataArray count];
}

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

    cell.textLabel.text = [cellDataArray objectAtIndex:indexPath.row];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setFrame:CGRectMake(270.0, 7.0, 30.0, 30.0)];

    if([[arrayCheckUnchek objectAtIndex:indexPath.row] isEqualToString:@"Uncheck"])
    [button setImage:[UIImage imageNamed:@"uncheck_icon"] forState:UIControlStateNormal];
    else
    [button setImage:[UIImage imageNamed:@"check_icon"] forState:UIControlStateNormal];

    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:button];

    return cell;
}

-(void)buttonClicked:(id)sender
{
    //Getting the indexPath of cell of clicked button

    CGPoint touchPoint = [sender convertPoint:CGPointZero toView:tblView];
    NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:touchPoint];

    // No need to use tag sender will keep the reference of clicked button
    UIButton *button = (UIButton *)sender;

    //Checking the condition button is checked or unchecked.
    //accordingly replace the array object and change the button image
    if([[arrayCheckUnchek objectAtIndex:indexPath.row] isEqualToString:@"Uncheck"])
    {
        [button setImage:[UIImage imageNamed:@"check_icon"] forState:UIControlStateNormal];
        [arrayCheckUnchek replaceObjectAtIndex:indexPath.row withObject:@"Check"];
    }
    else
    {
        [button setImage:[UIImage imageNamed:@"uncheck_icon"] forState:UIControlStateNormal];
        [arrayCheckUnchek replaceObjectAtIndex:indexPath.row withObject:@"Uncheck"];
    }
}

そして最後にそれは次のようになります-

ここに画像の説明を入力してください

于 2012-10-10T08:19:27.920 に答える
0

タグは、IBで設計されたカスタマイズされたuitableviewcellで役立ちます。プログラムでセルを作成する場合、タグは必要ありません。これらは、プロパティを設定するための正しいuiviewを見つけるためにのみ使用します。

于 2012-10-10T07:30:32.947 に答える
0

はい、これはUITableViewCell内のクラスを宣言し、タグを使用してそれらを識別するときにタグを設定するのは簡単です。参考までにサンプルコードを掲載しました。それがあなたの問題を解決するかどうかはわかりません。タグを設定し、タグを使用してクラスを識別する方法を尋ねました。だからそれはあなたにあなたの質問についてのいくつかの基本的な考えを与えるでしょう。

-(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] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        label1 = [[UIView alloc] initWithFrame:CGRectMake(2, 20, 15, 15)];
        label1.tag = 100;
        label1.backgroundColor = [UIColor whiteColor];
        label1.layer.cornerRadius = 5;
        [cell.contentView addSubview: label1];

        label2 = [[UILabel alloc] initWithFrame:CGRectMake(25, 2, 165, 23)];
        label2.tag = 101;
        label2.font = [UIFont boldSystemFontOfSize:15];
        label2.backgroundColor = [UIColor clearColor];
        [cell.contentView addSubview: label2];

        label3 = [[UILabel alloc] initWithFrame:CGRectMake(190, 2, 90, 23)];
        label3.tag = 102;
        label3.font = [UIFont systemFontOfSize:14];
        label3.textColor = [UIColor colorWithRed:0.14117670588235 green:0.435294117647059 blue:0.847058823529412 alpha:1];
        label3.backgroundColor = [UIColor clearColor];
        label3.textAlignment = UITextAlignmentRight;
        [cell.contentView addSubview: label3]; 
    }

   label1 = (UILabel *) [cell.contentView viewWithTag:100];
    NSString *string1 = [array1 objectAtIndex:indexPath.row];

  label2 = (UILabel *) [cell.contentView viewWithTag:101];
    NSString * string2 = [array2 objectAtIndex:indexPath.row];

  label3 = (UILabel *) [cell.contentView viewWithTag:102];
    NSString * string3 = [array3 objectAtIndex:indexPath.row];

   return cell;   
} 

これが役に立つかどうか教えてください。それ以外の場合は、別の方法で移動します。

ハッピーコーディング。ありがとう。

于 2012-10-10T07:32:07.140 に答える
0

@VakulSainiに同意します。これは、どのセルのタッチやスワイプなどを処理するためにこれを実行できるためです。これは例です。

-(void)handleSwipLeft:(UISwipeGestureRecognizer *)gestureRecognizer
{
    CGPoint Location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:Location];
    cell = [tableView cellForRowAtIndexPath:indexPath];
}
于 2012-10-10T07:32:36.153 に答える
0

cellForRowAtIndexPathのメソッドを使用UITableViewし、このメソッドで(UITextFieldUILabel.....など)のようなコンポーネントを追加します。UITableViewCellを使用 [cell.contentView addSubview:YourComponentName];して各コンポーネントをタグに指定しindexPath.rowます。

、、、のような

YourComponentName.tag = indexPath.row;
于 2012-10-10T07:43:07.833 に答える