1

私は先週の土曜日に同様の質問をしていましたが、賢い人々がバーベキューパーティーに参加していたようです。答えが得られませんでした。

私の問題は、UISwitchと2つのUIButtonをUITableViewCellに配置する必要があり、UISwitchの状態が変わると、これらのUIButtonが表示または非表示になることです。これらのセルはどこにでも移動するためのものではないため、情報提供のみに使用し、使用しません

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

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath methos必要なコントロールをプログラムで作成し、それぞれにタグ値とアクション:@selectorを割り当てました。

他のメソッドでは、現在の行からitemIDを取得する方法を管理しました。この方法のように:

-(void)setItem:(UISwitch*)sender
{
int n;
UITableViewCell *cell;
if(sender.tag==9001)
{
    cell=((UITableViewCell*)[sender superview]);
    n=([self.tableView indexPathForCell:cell].row);
}
item=[self.arr objectAtIndex:n];

NSDate *today=[NSDate date];
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
NSString *now =[formatter stringFromDate:today];

if(sender.on)
{
    DBAccess *access=[[DBAccess alloc]init];
    [access setItemON:item.itemID date:now];
    //qualityBtn.hidden=NO;
    [qualityBtn setTitleColor:[UIColor blackColor] forState:normal];
    [qualityBtn setTitle:@"UNDEF" forState:normal];
}
else 
{
    DBAccess *access=[[DBAccess alloc]init];
    [access setItemOFF:item.itemID];
}
}

したがって、私の問題は、このメソッドが機能する場合、他のセルのqualityBtn:sもタイトルなどを取得することですが、メソッドのロジックにより、現在のコントロールの現在のボタンを変更する必要があります。したがって、現在のセルに配置されているコントロールのみを変更し、他のコントロールを省略するようにメソッドを指定する方法。

前もって感謝します。

編集:

@property(nonatomic、strong)UIButton * qualityBtn; はい、それはグローバルです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
item=[self.arr objectAtIndex:[indexPath row]];

static NSString *CellIdentifier = @"Cell";
ItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


self.switchView = [[UISwitch alloc] initWithFrame:CGRectMake(7, 8, 79, 27)];
[switchView addTarget:self action:@selector(setItem:) forControlEvents:UIControlEventValueChanged];
[switchView setTag:9001];


qualityBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
[qualityBtn addTarget:self 
               action:@selector(setQuality:)
 forControlEvents:UIControlEventTouchDown];

qualityBtn.frame = CGRectMake(236, 8, 72, 21);
qualityBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[qualityBtn setTag:9002];

itemMemoBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[itemMemoBtn addTarget:self 
                action:@selector(setItemMemo:)
      forControlEvents:UIControlEventTouchDown];
itemMemoBtn.frame = CGRectMake(274, 43, 34, 30);
[itemMemoBtn setTag:9003];
[itemMemoBtn setImage:[UIImage imageNamed:@"comment-icon"] forState:normal];

lblDate=[[UILabel alloc]initWithFrame:CGRectMake(14, 34, 72, 21)];
lblDate.font=[UIFont systemFontOfSize:9];
[lblDate setTag:9003];

[cell addSubview:switchView];
[cell addSubview:qualityBtn];
[cell addSubview:itemMemoBtn];
[cell addSubview:lblDate];
[cell setIndentationWidth:45];
[cell setIndentationLevel:1];

lblDate.text=item.date;
cell.lblKM.text=item.kmRef;
cell.lblInfo.text=item.info;
if(item.dateFrom.length>0 && item.dateUntil.length>0)
{
    cell.lblYears.text=[NSString stringWithFormat:@"%@ - %@",item.dateFrom,item.dateUntil];
}
if(item.dateUntil.length<1)
{
    cell.lblYears.text=item.dateFrom;
}

if(item.mintMark.length<1)
{
    //cell.mintmarksImageView.hidden=YES;
}
cell.lblMintmarks.text=item.mintMark;

if(item.memo.length>0)
{
    cell.lblMemoStatus.text=@"YES";
}
else 
{
    cell.lblMemoStatus.text=@"NO";
}

cell.lblRarity.text=item.rarity;

if(item.isAvailable==0)
{ 
    [switchView setOn:NO];
    //qualityBtn.hidden=YES;
    //lblDate.hidden=YES;
    qualityBtn.titleLabel.text=@"UNDEF";
}
else {
    [switchView setOn:YES];
   // lblDate.hidden=NO;
    NSString *quality=nil;
    switch(item.quality)
    {
        case 1:
        {
            quality=@"UNDEF";
            break;
        }
        case 2:
        {
            quality=@"G";
            break;
        }
        case 3:
        {
            quality=@"VG";
            break;
        }
        case 4:
        {
            quality=@"F";
            break;
        }
        case 5:
        {
            quality=@"VF";
            break;
        }
        case 6:
        {
            quality=@"XF";
            break;
        }
        case 7:
        {
            quality=@"UNC";
            break;
        }
        case 8:
        {
            quality=@"PROOF";
            break;
        }
    }
    [qualityBtn setTitleColor:[UIColor blackColor] forState:normal];
    [qualityBtn setTitle:quality forState:normal];
}

return cell;
}
4

2 に答える 2

2

デリゲートメソッドのセルにサブビューを追加しないでください。UITableViewCellをサブクラス化する必要があります(例:MCMyCustomTableViewCell、再利用できるように要素を作成します(dequeueメソッドを使用)。完了したら、セルにプロパティを持つ変数を作成します(たとえば、@ property(nonatomic、strong )NSInteger cellIndex;)cellForRowAtIndexPathを実行するときに入力する必要があります:...コントローラーのボタンにターゲットを追加し、ステータスが変更されたとき、またはボタンが押されたときに実行します。

- (void)didClickButton:(UIButton *)sender{
    NSInteger index = [(MCMyCustomTableViewCell *)sender.superview cellIndex];
    // Place for your code here
}

そしてスイッチと同じより:)

于 2012-05-06T17:55:47.343 に答える
1

UITableViewCellサブクラスを拡張し、スイッチとボタンのプロパティを設定することをお勧めします。このようなもの:

@interface YourCustomCell: UITableViewCell
@property(strong,nonatomic) UISwitch *switchView
@property(strong,nonatomic) UIBtton *qualityBtn
@property(strong,nonatomic) UIBtton *memoBtn
@end

cellForRowAtIndexPath:次に、次のようにします。

cell.switchView = [[UISwitch alloc] initWithFrame:CGRectMake(7, 8, 79, 27)];
[cell.switchView addTarget:self action:@selector(setItem:) forControlEvents:UIControlEventValueChanged];
[cell.switchView setTag:9001];
/* setting the other properties is not shown */

これで、setItem:メソッドで、次の手順を実行して正しいボタンに簡単にアクセスできます。

cell.qualityBtn
cell.memoBtn

ただし、ユーザーがテーブルをスクロールしてセルの割り当てが解除され、再割り当てされたときにセルが正しい状態(ボタンが表示されているかどうか)で割り当てられるように、スイッチの状態を追跡するある種のモデルを更新する必要があることに注意してください。最も単純なのは、セルのNSIndexPathをキーとして持つNSDictionaryです。

これがお役に立てば幸いです。

于 2012-05-06T18:03:42.633 に答える