0

アドレス帳の連絡先をインポートし、画像、連絡先名、チェックボックスを表示するテーブルがあります。セルを画像、ラベル、およびチェックマークとして機能するボタンでカスタマイズしました。すべての連絡先を正常に表示でき、チェックマークも個々のセルで正常に機能しますが、テーブル内のすべてのボタンを選択状態にし、もう一度クリックするとすべての選択が解除されるすべてのボタンを選択する機能の実装に問題があります。これは私がこれまで行ってきたことです。

//これはカスタム セルのクラスです

#import "InviteFriendsCell.h"

@implementation InviteFriendsCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

       }

   //This is my checkmark button
-(IBAction)onAddTouched:(id)sender
{
    UIButton *addButton = (UIButton *)sender;
    [addButton setSelected:![addButton isSelected]];
}
@end

//これは FriendListViewController のテーブルビュー表示コードです

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

    InviteFriendsCell *cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

       if(cell==nil)
       {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

       }
    // Configure the cell...

    NSUInteger row = 0; 
    NSUInteger sect = indexPath.section;
    for (NSUInteger i = 0; i < sect; ++ i)
        row += [self tableView:tableView numberOfRowsInSection:i];
    row += indexPath.row;

    cell.thumbImage.layer.cornerRadius=25;
    cell.thumbImage.clipsToBounds=YES;
    cell.thumbImage.image=nil;


        self.persons = CFArrayGetValueAtIndex(self.contactAdd, row);

        NSString *tweet=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(self.persons)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        [cell.friendName setText:tweet];

        if (ABPersonHasImageData(persons))
        {
            NSData  *imgData = (__bridge NSData *) ABPersonCopyImageDataWithFormat(persons, kABPersonImageFormatThumbnail);
            cell.thumbImage.image = [UIImage imageWithData:imgData];
        }
        else
        {
            cell.thumbImage.image = [UIImage imageNamed:@"name_icon.png"];
        }

    return cell;
}

//これは、テーブルビューのすべてのボタンにチェックマークを付ける必要がある私のすべての選択ボタンです

  - (IBAction)selectAll:(UIButton *)sender {

       //This is where I need to implement the code
    }

ここでスタック オーバーフローに同様の質問があります UITableView のすべて選択ボタンを作成し、iOS の配列に選択を追加する必要があります

しかし、ここではチェックマークボタンが tableview メソッド内に作成されています。私のケースは異なり、そのコードを実装できません。これを行うより良い方法はありますか?私はストーリーボードと xcode 5 を使用しており、ios 5 以降で動作するはずです。

4

3 に答える 3

0

データ ソースとセルを変更する必要があります。contactAdd連絡先が選択されていることを知る必要があります(これには新しい配列を使用できますが、なぜそうするのですか)。ボタンがタップされたときに、セルがコントローラーにコールバックして、ボタンが選択されているかどうかをコントローラーに伝える必要があります。コントローラは、セルを更新して、選択したステータスを設定する必要があります。

多数のセルがあり、いくつかを選択してからスクロールすると、コードは現在正しく機能しません (再利用識別子が正しく構成されているかどうかに応じて、他の行が選択済みとして表示されるか、選択が失われます)。

また、あなたcontactAddは過度に複雑です。現在のインデックス作成は維持が複雑であるため、複数の配列 (セクションごとに 1 つ) の使用を検討してください。

于 2013-10-13T09:04:21.967 に答える
0

最初にブール値を持つ配列を作成します

@property (retain, nonatomic) NSMutableArray *selectedArray;

連絡先の追加数に基づいて選択した配列を初期化し、これを拡張する予定がある場合は、それをより一般化し、NSArray に格納します。ここでpeopelistは私のNSArrayです

self.peopleList=(__bridge NSArray *)(self.contactAdd);

           self.selectedArray=[[NSMutableArray alloc]initWithCapacity:[self.peopleList count]];
           for(int i=0;i<[self.peopleList count];i++)
           {
               [self.selectedArray insertObject:[NSNumber numberWithBool:NO] atIndex:i];
           }

In the selectAll button action use this
- (IBAction)selectAll:(UIButton *)sender {


   for(int i=0;i<self.selectedArray.count;i++)
      [self.selectedArray replaceObjectAtIndex:i withObject:[NSNumber numberWithBool:sender.isSelected]];
   [sender setSelected:!sender.isSelected];

   [yourTable reloadData];

}
于 2013-10-15T09:11:46.763 に答える