UIButton状态在变化

时间:2012-07-23 08:05:27

标签: iphone ios xcode

我有一个自定义的ImagePicker。一张UIScrollView包含我NSDocumentDirectory的图片,然后我将按钮添加为我的图片框架,就像缩略图视图一样。我添加的是当它被选中然后被解雇时,下次视图加载/出现/显示它将具有图像复选标记。没关系。但我需要的是,当我点击一个图像时,它将被选中或者将显示图像“复选标记”,然后当我点击相同的图像时,复选标记将会消失。

以下是对我所拥有的代码的解释:

// UISCrollView

- (void)viewDidLoad {

    // Create view
    UIScrollView *view = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,1024.0f,768.0f)];

    int row = 0;
    int column = 0;
    for(int i = 0; i < _thumbs.count; ++i) {

        UIImage *thumb = [_thumbs objectAtIndex:i];
        myButton = [UIButton buttonWithType:UIButtonTypeCustom];
        myButton.frame = CGRectMake(column*140+24, row*150+10, 100, 100);
        [myButton setImage:thumb forState:UIControlStateNormal];
        [myButton addTarget:self 
                     action:@selector(buttonClicked:) 
           forControlEvents:UIControlEventTouchUpInside];
        myButton.tag = i; 
        NSLog(@"%i",i);

        NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        NSInteger selectedImageSlot1 = [prefs integerForKey:@"selected1"];

        if ( selectedImageSlot1 == i){
            [self turnButtonToSelected];
        } 
}

//点击按钮时

- (IBAction)buttonClicked:(id)sender {
    myButton = (UIButton *)sender;
    self.selectedImage = [_images objectAtIndex:myButton.tag];

    [[NSUserDefaults standardUserDefaults] setInteger:myButton.tag forKey:@"selected1"];

    [self dismissModalViewControllerAnimated:NO];
}

//选择按钮时的方法

   - (void)turnButtonToSelected
    {
        UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
        [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
        [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
        [myButton setEnabled:NO];
    }

3 个答案:

答案 0 :(得分:0)

如果选择了按钮,则保持布尔值。在你的界面中保留一个名为BOOL selected;的布尔变量跟踪值,并设法保存它。然后在你的turnButtonToSelected方法中添加:

- (void)turnButtonToSelected
{
   selected = !selected;
   if (selected)
   {
      UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
      [myButton setBackgroundImage:bgImage forState:UIControlStateNormal];
      [myButton setBackgroundImage:bgImage forState:UIControlStateHighlighted];
      [myButton setBackgroundImage:bgImage forState:UIControlStateDisabled];
   }
   else
   {
      // set button image without the check mark
   }
}

这将确保,如果之前选择了按钮,现在再次点击复选标记 将会消失。

答案 1 :(得分:0)

首先,您需要保持选定的图像索引,因此创建selectedImageIndex实例变量 然后在viewDidLoad中,不需要调用

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSInteger selectedImageSlot1 = [prefs integerForKey:@"selected1"];  
在for循环中

... 将它放在for循环之前,并将选定的图像索引存储在selectedImageIndex中。

- (void)viewDidLoad {

    // Create view
    UIScrollView *view = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,1024.0f,768.0f)];

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    self.selectedImageIndex = [prefs integerForKey:@"selected1"];

    int row = 0;
    int column = 0;
    for(int i = 0; i < _thumbs.count+1; ++i) {

        UIImage *thumb = [_thumbs objectAtIndex:i];
        myButton = [UIButton buttonWithType:UIButtonTypeCustom];
        myButton.frame = CGRectMake(column*140+24, row*150+10, 100, 100);
        [myButton setImage:thumb forState:UIControlStateNormal];
        [myButton addTarget:self 
                     action:@selector(buttonClicked:) 
           forControlEvents:UIControlEventTouchUpInside];
        myButton.tag = i+1; 
        NSLog(@"%i",i);


        if (self.selectedImageIndex == myButton.tag){
            [self turnButtonToSelected:myButton];
        } 
}  

[myButton setEnabled:NO];移除行turnButtonToSelected,以便用户可以重新点击该按钮取消选择。将turnButtonToSelected更改为:

   - (void)turnButtonToSelected:(UIButton *)button
    {
        UIImage *bgImage = [UIImage imageNamed:@"Checkmark.png"];
        [button setBackgroundImage:bgImage forState:UIControlStateNormal];
        [button setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [button setBackgroundImage:bgImage forState:UIControlStateDisabled];
    }    

    - (void)turnButtonToDeselected:(UIButton *)button
    {
        UIImage *bgImage = [UIImage imageNamed:@"Not-Checkmark.png"];
        [button setBackgroundImage:bgImage forState:UIControlStateNormal];
        [button setBackgroundImage:bgImage forState:UIControlStateHighlighted];
        [button setBackgroundImage:bgImage forState:UIControlStateDisabled];
    }

然后,当用户点击图像时,请检查当前是否选择了该图像 如果是 - 请拨打turnButtonToDeselected 如果没有 - 你打电话给turnButtonToSelected

- (IBAction)buttonClicked:(id)sender {
    myButton = (UIButton *)sender;
    self.selectedImage = [_images objectAtIndex:myButton.tag - 1];

    [[NSUserDefaults standardUserDefaults] setInteger:myButton.tag forKey:@"selected1"];

    if (myButton.tag == self.selectedImageIndex) {
        // user tap on a button that was selected, so we need to deselect it 
        [self turnButtonToDeselected:myButton];
    }
    else {
        // user tap on a button that wasn't selected

        // first we check if there is a selected button, if yes we need to deselect it
        if (self.selectedImageIndex > 0) {
            // get the selected button
            UIButton *selectedButton = (UIButton *)[self.view viewWithTag:self.selectedImageIndex];
            // deselect it
            [self turnButtonToDeselected:selectedButton];
        }

        // now we can select the button the user tapped on
        [self turnButtonToSelected:myButton];


        // save the selected index
        self.selectedImageIndex = myButton.tag;
    }
}

还有一件事,在viewDidLoad中将按钮标记设置为i + 1

答案 2 :(得分:0)

你需要创建按钮阵列。当按钮点击事件你需要检查按钮时是否设置了勾选图像。

-(IBAction)buttonclickevent:(id)sender{

  UIButton *btn=sender;

  UIButton *currentbutton=[ButtonArray objectAtIndex:btn.tag];


 if([currentbutton.currentImage isEqual:[UIImage imageNamed:@"Checkmark.png"]])

  [currentbutton setImage:[UIImage imageNamed:@"normal.png"]forState:UIControlStateNormal];

}
else {

  [currentbutton setImage:[UIImage imageNamed:@"Checkmark.png"]forState:UIControlStateNormal];
}

}