2014-09-11 73 views
1

我有一个包含按钮的表格视图。我想要做的是,我想保持点击按钮(s)在选定状态,直到他们再次轻敲(这应该取消选择它们)。这就像一个复选框说实话。简单,对吗?
但问题是,由于使用单个布尔标志来查看按钮是第一次还是第二次按下,事情变得混乱。例如我点击按钮一,然后我点击按钮二,现在我想取消选择按钮一,所以我再次点击它,但它不取消选择,因为标志设置为是(虽然它取消选择一次再次)。当你有多个按钮时如何保持在UITableView中选择UIButton状态?

有没有办法避免这种情况,只需点击一下就能达到预期效果? 截图:http://i60.tinypic.com/1z51653.png 这是我在做什么:

-(void) btnStateChanged: (UIButton *) btnProblem 
{ 
    static BOOL btnPressedFirstTime=YES; 
    if(btnProblem.selected==YES || btnProblem.highlighted==YES) 
    { 
     if(btnPressedFirstTime==YES) 
     { 
      [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
      btnPressedFirstTime=NO; 
     } 
     else if(btnPressedFirstTime==NO) 
     { 
      [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
      btnPressedFirstTime=YES; 
     } 
    } 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+0

创建另一个数组有值0,1和基于点击此数组的值,并重新加载的tableview和放映按钮按这个数组... – 2014-09-11 11:29:22

+0

嘿@NSNoob检查我的答案.. ,, – 2014-09-11 11:32:00

回答

0

感谢您的回复家伙。我尝试了几个你的答案,但idk也许是因为我不明白这是正确的,它不适合我。这是我想出来的,对于给定的问题它工作得很好。我之前应该想到它,对我来说太愚蠢了。标签!那是我需要的。

-(void) btnStateChanged: (UIButton *) btnProblem 
{ 
    if (btnProblem.tag == 1000) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
     btnProblem.tag = 1001; 

    }else if(btnProblem.tag == 1001) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
     btnProblem.tag = 1000; 

    } 
+1

标记是在TableView中执行此操作的一个非常麻烦的方法,因为滚动时单元格重用。 – 2014-09-11 12:37:49

+0

我需要8个按钮。所以我做了8个部分,每个部分包含一个单元格。现在在iPad横向(默认和唯一的方向为我的应用程序),所有8个按钮都在视图中(或正在使用,因为它是我的理解)。你认为在这种特定情况下它是安全的吗? – NSNoob 2014-09-11 12:46:56

+1

如果您从不滚动或者所有单元格都有不同的重用ID,并且您从不在桌面视图上执行任何类型的reloadData或动画,则重用不会触及您。但是,这是一个很长的名单,如果...... – 2014-09-11 18:19:25

1

启动与对象描述每个按钮状态的阵列。因此,可以说你有10个按钮:

NSMutableArray *buttonStates = [NSMutableArray new]; 

for (int i = 0; i < 10; i++) 
{ 
    [buttonStates addObject:[NSNumber numberWithBool:NO]]; 
} 

现在,当你点击按钮2号(注意,您必须用它的行的索引标签上的按钮):

- (void)btnStateChanged:(UIButton *)btnProblem 
{ 
    int buttonIndex = btnProblem.tag; 
    BOOL state = [[buttonStates objectAtIndex:buttonIndex] boolValue]; 
    [buttonStates replaceObjectAtIndex:buttonIndex withObject:[NSNumber numberWithBool:!state]]; 
} 

这样,你总是知道每个按钮具有哪个状态。

+0

讨厌的代码是当你想查询数组来设置任意按钮的状态时 - 你需要检查每个元素。 – 2014-09-11 11:25:22

0

使用数组存储的对象中选择,或者你可以说抽头按钮...在呼吁自来水检查的功能,如果该按钮是在阵列或不..并更改图像相应EG-

NSMutableArray *selectedBtnArr = [[NSMutableArray alloc]init]; 

    if ([selectedBtnArr containsObject:btnProblem]) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
     [selectedBtnArr removeObject:btnProblem]; 
    }else{ 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
     [selectedBtnArr addObject:btnProblem]; 
    } 

或者,如果你不想使用数组的任务比使用标签..设置按钮标签像1,2,3..10我假设你有10个按钮。并使用此代码,如果选择或没有按键识别 -

if (btnProblem.tag < 100) { 
    [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
    btnProblem.tag = btnProblem.tag+100; 
}else{ 
    [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
    btnProblem.tag = btnProblem.tag-100; 
} 
+0

这是在UITableViewCell内部使用的一个可怕的解决方案,tableView滚动tableView的重用机制的那一刻将很难打你。 (在视图重用环境之外,可能工作得很好) – 2014-09-11 12:05:45

0

这正是NSMutableIndexSet是。它实际上是一个稀疏的bool标志数组。

您可以通过调用addIndex:来设置或取消设置任何标志,并且removeIndex:可以取消设置。您使用NSIndexSetcontainsIndex:测试其中一个标志的值。

这段代码看起来很像@greshking的NSMutableArray代码,但是你会少得多boolValue和numberWithBool:faffing。

0

为什么不只是子类UIButton具有你想要的视觉行为?
毕竟,一个按钮是已经跟踪其状态的东西。

@interface CBBCheckBoxLikeButton : UIButton 
@end 
@implementation CBBCheckBoxLikeButton 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    [self communInit]; 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    [self communInit]; 
    return self; 
} 

- (void)communInit 
{ 
    // The image setting could be done from the outside ot the class 
    [self setBackgroundImage:[[UIImage imageNamed:@"grayPixel"] resizableImageWithCapInsets:UIEdgeInsetsZero] forState:UIControlStateNormal]; 
    [self setBackgroundImage:[[UIImage imageNamed:@"greenPixel"] resizableImageWithCapInsets:UIEdgeInsetsZero] forState:UIControlStateSelected]; 
    self.selected = NO; 
} 

- (void)setHighlighted:(BOOL)highlighted 
{ 
    [self updateSelectedStateForHighlighted:highlighted]; 
    [super setHighlighted:highlighted]; 
} 

- (void)updateSelectedStateForHighlighted:(BOOL)highlighted 
{ 
    if (highlighted) 
     self.selected = !self.selected; 
} 

@end 

但是,您仍然有处理TableView重复使用机制的问题,以保持您的视觉与您的按钮同步。 但这可能反映在您的数据模型中。

因此,在您- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法,你只需要做到:
cell.button.selected = dataForCell.wasButtonSelected;

注意,按钮将需要一个“自定义”按钮,“系统”按钮将运行异常。您可以/应该提供一种避免客户端代码陷阱的创建方法。

相关问题