上周六我问过类似的问题,但看起来很聪明的人正在参加烧烤派对。没有得到答案。
我的问题是我需要在UITableViewCell上放置UISwitch和两个UIButton,当UISwitch改变状态时,这些UIButton应该出现或消失。这些单元格不用于导航到任何地方,因此我仅将它们用于信息演示,而不使用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
In - (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也会得到标题等,但我需要当前控件上的当前按钮会因方法的逻辑而改变。那么,如何指出它只会改变当前单元格上的控件并省略其他控件的方法。
提前谢谢你。
编辑:
@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)
{
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;
}
答案 0 :(得分:2)
不要在委托方法中向子单元添加子视图。你必须继承UITableViewCell(例如:MCMyCustomTableViewCell,在其中创建你的元素,以便它可以重复使用(通过dequeue方法)。完成后,在单元格中创建一个带属性的变量(例如@property(非原子,强) )NSInteger cellIndex;)在执行cellForRowAtIndexPath时你必须填写:...向控制器中的按钮添加目标,当状态改变或按下按钮时:
- (void)didClickButton:(UIButton *)sender{
NSInteger index = [(MCMyCustomTableViewCell *)sender.superview cellIndex];
// Place for your code here
}
与开关相同:)
答案 1 :(得分: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
但请记住,您应该更新某种模型,它会跟踪开关状态,以便当用户滚动表格并且单元格被释放并重新分配时,单元格将被分配正确的状态(按钮是否显示) )。最简单的是NSDictionary,它以单元格的NSIndexPath为键。
我希望这会有所帮助。