2012-05-06 20 views
1

私は最後の土曜日に同様の質問をしていましたが、スマートな人々がバーベキューパーティーにいたようです。答えを得られなかった。iOS:現在のTableViewCellの現在のコントロールを指す方法

私の問題は、UITableViewCellにUISwitchと2つのUIButtonを配置する必要があり、UISwitchが状態を変更するときにこれらのUIButtonsが表示されるか消えてしまうことです。これらの細胞は、どこにもナビゲーションにないされ、従って、私は、情報提供のみを提示するためにそれらを使用し、で

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

enter image description here

を使用していない - (UITableViewCellの*)のtableView:(のUITableView *)のtableViewのcellForRowAtIndexPath: (NSIndexPath *)indexPathメソッド必要なコントロールをプログラムで作成し、それぞれにタグ値とアクション@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はまた、などのタイトルを取得しますが、私は、現在のコントロールの現在のボタンは、メソッドのロジックにより変更することが必要。したがって、現在のセルに置かれたコントロールだけを変更し、他のセルは省略するという方法を指す方法。

ありがとうございます。

EDIT:

@property(アトミック、強い)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) 
{ 
    [email protected]"YES"; 
} 
else 
{ 
    [email protected]"NO"; 
} 

cell.lblRarity.text=item.rarity; 

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

return cell; 
} 
+0

実際にqualityBtnを割り当てたコードを表示できますか?あなたの提供されたスニペットからは、現在のセルには関係なく、何らかのグローバルオブジェクトのように見えます。 –

+0

ちょっと... – NCFUSN

+0

更新を参照してください – NCFUSN

答えて

1

あなたのUITableViewCellサブクラスを拡張し、スイッチとボタンのプロパティを持つことをお勧めします。このような何か:cellForRowAtIndexPathで

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

:あなたはこのような何かをするだろう:あなたのSetItem関数で今

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 */ 

:方法することができます

cell.qualityBtn 
cell.memoBtn 
を実行して、正しいボタンの簡単なアクセス

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

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

+0

有望な音。私は今それを試してみましょう。 – NCFUSN

+0

セルでコントロールを設定してIBOutletsを使用しなければならないということですか? – NCFUSN

+0

IBでビューを構築する場合は、プロパティをIBOutletsとしてマークする必要があります(yes)。 XIBファイル/ストーリーボードに接続する必要があります。 –

2

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

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

と比べてスイッチと同じです:)

+0

それで、私はストーリーボードのセルにスイッチを置き、アイテムクラスからそれを操作することができますか? – NCFUSN

+0

私はストーリーボードやNIX(XIB)ファイルを使用せず、プロジェクトに複数の開発者がいる場合、コードベースを管理する方がはるかに簡単なので、コード内のすべてを実行します。 – Ondrej

+0

最初に私のチュートリアルはこちら:http://www.xprogress.com/post-32-uinavigationbar-tutorial-with-uitable-pushing-detail-view-using-didselectrowatindexpath-and-all-xcode-example-source-files/プログラムでテーブルを作成する方法を考えてください。あなたが将来のストーリーボードを使用している場合でも、それがどのように動作するかを知るにはかなり便利でしょう:) – Ondrej

関連する問題