【问题标题】:UIButton state changingUIButton 状态变化
【发布时间】:2012-08-01 22:35:56
【问题描述】:

我有一个自定义 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];
    }

【问题讨论】:

    标签: iphone ios xcode


    【解决方案1】:

    首先你需要保留选定的图像索引,所以创建一个 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];
            } 
    }  
    

    turnButtonToSelected 中删除[myButton setEnabled:NO]; 行,以便用户可以重新点击按钮以取消选择它。将 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

    【讨论】:

    • 为什么要将按钮标签设为 i+1,我需要它为 0。
    • 因为如果你还没有设置 selectedImageIndex,那么它的默认值为 0。这可能会导致混淆,因为你可能认为标签为 0 的按钮当前被选中...
    • 好吧,我真的需要把它变成 0。
    • 为什么?当你想使用它时,你总是可以做 i-1.. 就像你做 [_images objectAtIndex:myButton.tag];而不是 [_images objectAtIndex:myButton.tag - 1];
    • 或者不使用 NSInteger selectedImageIndex,你可以使用 NSIndexPath 和第 0 部分。那么 tag=0 不是问题,因为如果你不设置 selectedImageIndex,它只会是 nil...
    【解决方案2】:

    如果按钮被选中,则保留一个布尔值。在您的界面中保留一个名为 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
       }
    }
    

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

    【讨论】:

    • 这个 turnButtonToSelected 什么时候被调用?
    • @Kobe.o4 当然它工作!为什么将enabled 属性设置为NO?它会导致在第一次点击后您不会再提供有关此对象的触摸事件的通知。
    • 那么当再次点击带有复选标记的按钮时它不会被调用,对吧?尝试在选择按钮时执行此操作,并且视图会获得用户交互。
    • @holex,这就是我在第一次尝试时所做的。这次我换个方法好吗?
    【解决方案3】:

    您需要创建按钮数组。当按钮单击事件时,您需要检查按钮是否设置了复选标记图像。

    -(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];
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多