【问题标题】:Implementing toggle feature in a UIButton在 UIButton 中实现切换功能
【发布时间】:2011-05-11 15:17:44
【问题描述】:

我想知道如何将切换功能添加到UIButton,就像用户点击一个未选中的按钮,该按钮被选中并保持选中状态,直到用户再次点击它,就像以前一样取消选中。

我正在考虑制作一个 IBAction 将其从未选中更改为选中,我该怎么做?

这是我尝试过的:

-(IBAction)toggle {

    //Toggle on implementation.

        button.selected = YES;
        button.highlighted = NO;
        button.enabled = YES;

    //Toggle off implementation.

    if (button.highlighted == YES) {

        button.selected = NO;
        button.highlighted = YES;
        button.enabled = NO;
    }
}

问题...

-(IBAction)toggleFav {

    if (favButton == nil) {

        UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
        UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
        [favButton setImage:unselectedImage forState:UIControlStateNormal];
        [favButton setImage:selectedImage forState:UIControlStateSelected];
        [favButton setFrame:CGRectMake(0, 0, 40, 40)];
    }       

    if([favButton isSelected]){

        //Add to menu.
        [favButton setSelected:NO];
    } else {

        //Remove from menu.

        [favButton setSelected:YES];
    }
}

【问题讨论】:

    标签: objective-c ios cocoa-touch uiimageview uibutton


    【解决方案1】:
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        static NSString *CellIdentifier = @"Cell";
    
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            UIImage *unselectedImage = [UIImage imageNamed:@"unselected.png"];
            UIImage *selectedImage = [UIImage imageNamed:@"selected.png"];
            UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
            [b setBackgroundImage:unselectedImage forState:UIControlStateNormal];
            [b setBackgroundImage:selectedImage forState:UIControlStateSelected];
            [b addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
            [b setFrame:CGRectMake(0, 0, 40, 40)];
            [cell.contentView addSubview:b];
        }       
        return cell;
    }
    
    -(void) buttonPressed:(UIButton *)sender
    {
        if([sender isSelected]){
            //...
            [sender setSelected:NO];
        } else {
            //...    
            [sender setSelected:YES];
        }
    
    }
    

    您的toggleFav 代码没有多大意义。
    if (favButton == nil) { 检查favButton 是否存在。但是如果你用 IB 连接它,它应该一直在那里。如果不是,按钮怎么会调用这个方法呢?所以这样做:

    -(void)viewDidLoad
    {
        //....
        UIImage *unselectedImage = [UIImage imageNamed:@"favUntapped.png"];
        UIImage *selectedImage = [UIImage imageNamed:@"favTapped.png"];
        [favButton setImage:unselectedImage forState:UIControlStateNormal];
        [favButton setImage:selectedImage forState:UIControlStateSelected];
        [favButton setFrame:CGRectMake(0, 0, 40, 40)];
        //....
    }
    
    
    -(IBAction)toggleFav:(UIButton *)sender {
        if([sender isSelected]){
            //...
            [sender setSelected:NO];
        } else {
            //...    
            [sender setSelected:YES];
        }
    }
    

    Here 你会找到一个带有 DetaiView 的示例项目,其中包含一个具有 2 种状态的按钮。
    注意:我正在保存有关在哪个按钮中选择的信息NSUserDefaults。你不应该那样做。相反,您需要将其保存在模型中。但由于我没有关于您的模型的信息,所以我只是使用 NSUserDefaults。

    【讨论】:

    • 正如我在other question 中所写:星星与表格视图无关。它们是按钮的一部分。您可以将按钮添加到任何视图,即(派生自)UIView。如果你不知道这个,你真的应该读一些documentation
    • 伙计,我不得不说:你的态度真的没有帮助(“我不想要”,“我没有任何代码”,“还在等待”,“还在等待(再次)”)。这里有很多人,愿意帮助你。但你应该说服他们,你已经尽力自己管理它。含义:参考文档,显示代码,准确解释你卡在哪里。
    • 我尝试了代码,但是当我走出实现它的视图时。它不记得状态。我还在 IBAction 下实现了您的代码。
    • 有一个小错误:每次重新加载单元格时,我都会在旧按钮的顶部绘制一个新按钮。看我的固定编码。
    • 我只复制了按下的 -(void)button。我在 Interface Builder 中完成了所有其余的工作。
    【解决方案2】:

    你应该这样编码:

    -(IBAction)toggle:(id)sender {
    
        //Toggle on implementation.
       if (sender.highlighted == NO)
         {
            sender.selected = YES;
            sender.highlighted = NO;
            sender.enabled = YES;
         }
    
        //Toggle off implementation.
    
       else{
    
            sender.selected = NO;
            sender.highlighted = YES;
            sender.enabled = NO;
        }
    }
    

    【讨论】:

    • 你确定应该是发件人吗?
    • 好的,但是当我运行它时,它会出现错误,例如突出显示的不是结构或联合。
    • 更准确地说,我得到了这样的东西:请求成员在不是结构或联合的东西中“突出显示”。
    • UIButton *resultButton = (UIButton *)sender; resultButton.highlighted=YES;
    【解决方案3】:
    -(void)hitButton:(UIButton*)button
    {
        buttonOnFlag = !buttonOnFlag;
        if( buttonFlag )
            [self performSelector:@selector(setHighlight:) withObject:button afterDelay:0];
    }
    
    - (void)setHighlight:(UIButton*)button 
    {
        button.highlighted = true;
    }
    

    【讨论】:

      【解决方案4】:

      使用 button.highlighted 属性

      【讨论】:

      • 按钮会直接打开和关闭吗?
      • 或者使用一些标志值并相应地设置两个差异按钮图像
      • 如果你使用一个按钮意味着去两个差异图像,一个用于突出显示状态,另一个用于禁用状态
      • 其实我刚刚做了一个IBAction,里面有这个:button.selected = YES;和 button.highlighted = NO;当我现在点击按钮时,它会像我想要的那样保持突出显示,但是当我再次点击它时它不会熄灭。它只是闪烁。
      • 使用 IBAction 中的 if 条件 if(button.highlighted==NO) 设置为 YES,反之亦然
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2018-07-08
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多