获取 UIButton 按下的内容

Posted

技术标签:

【中文标题】获取 UIButton 按下的内容【英文标题】:getting the contents of UIButton press 【发布时间】:2014-05-14 01:38:45 【问题描述】:

我不确定以前是否有人问过这个问题,但无论如何我都会问。我正在研究一个按钮网格,每个按钮的标题都是字母。我从一个数组中获取这些字母的内容,我相信这就是我的问题所在。标题看起来很好,但是当我按下阵列中的任何按钮时,这就是我的问题所在。

每按一个字母,我的 NSLog NSLog(@"Letter Added to Array: %@", self.sectionButton.titleLabel.text); 部分就会显示

Letter Added to Array: S

这就是显示的全部内容。不管按什么按钮。我想这可能只是因为S 是我数组中的最后一个对象,这就是它这么说的原因。我不知道,所以任何帮助将不胜感激。

这是我的代码:

- (void) didTouchButton

[self.lettersPressedArray addObject:self.sectionButton.titleLabel.text];
NSLog(@"Letter Added to Array: %@", self.sectionButton.titleLabel.text);
NSLog(@"Letters Pressed = %@", self.lettersPressedArray);


- (void)showGridWithRows:(int)r columns:(int)c arrayOfContent:(NSArray *)content withSizeOfContent:(CGFloat)contentSize

for (int i = 0; i < content.count; i++) 

    // vars
    int row = (int)i / r; // to figure out the rows
    int col = i % c;      // to figure out the columns
    float x = 0;
    float y = 0;

    // sizing options
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
        CGSize screen = [UIScreen mainScreen].bounds.size;

        if (screen.height == 480) 
            x = 1 + (40 * col);
            y = 1 + (30 * row);
        
        else 
            x = 2 + (40 * col);
            y = 1 + (31 * row);
        
    
    else 
        x = .5 + (90 * col);
        y = 1 + (90 * row);
    

    //button
    self.sectionButton = [UIButton buttonWithType:UIButtonTypeSystem];
    [self.sectionButton setTintColor:[UIColor lightGrayColor]];
    self.sectionButton.frame = CGRectMake(x, y, contentSize, contentSize);
    self.sectionButton.tag = 100 + row * c + col;
    [self.sectionButton addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];

    // font stuff
    self.sectionButton.titleLabel.textAlignment = NSTextAlignmentCenter;
    self.sectionButton.titleLabel.backgroundColor = [UIColor clearColor];
    self.sectionButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Light" size:22];
    [self.sectionButton setTitleColor:[UIColor blackColor]/*[UIColor colorWithRed:241.0/255.0 green:124.0/255.0 blue:22.0/255.0 alpha:1.0]*/ forState:UIControlStateNormal];

    // title
    s = (NSString *)[content objectAtIndex:i];
    [self.sectionButton setTitle:s forState:UIControlStateNormal];

    // color
    if ([s isEqualToString:@"A"] ) 
        [self.sectionButton setBackgroundColor:[UIColor greenColor]];
    
    else if([s isEqualToString:@"Z"]) 
        [self.sectionButton setBackgroundColor:[UIColor redColor]];
    
    else 
        [self.sectionButton setBackgroundColor:[UIColor lightGrayColor]];
    

    //layer
    self.sectionButton.layer.borderWidth = .65;
    //self.sectionButton.layer.cornerRadius = 5.0;

    for(int j = 0; j < c; j++) 
        for (int k = 0; k < r; k++) 
            [self addSubview:self.sectionButton];
        
    

【问题讨论】:

【参考方案1】:

改变这个:

- (void) didTouchButton

[self.lettersPressedArray addObject:self.sectionButton.titleLabel.text];
NSLog(@"Letter Added to Array: %@", self.sectionButton.titleLabel.text);
NSLog(@"Letters Pressed = %@", self.lettersPressedArray);

到这里:

- (void) didTouchButton:(UIButton *)sender

[self.lettersPressedArray addObject:sender.titleLabel.text];
NSLog(@"Letter Added to Array: %@", sender.titleLabel.text);
NSLog(@"Letters Pressed = %@", self.lettersPressedArray);

当你分配你的按钮选择器时,添加一个':'

所以,这个:

@selector(didTouchButton)

将是:

@selector(didTouchButton:)

可能实现如下:

[someButton addTarget:self action:@selector(didTouchButton:) forControlEvents:UIControlEventTouchUpInside];

因为:

您最初通过self.selectionButton.titleLabel.text 引用按钮的方式是访问按钮的一个特定实例。这意味着无论哪个按钮触发didTouchButton,它都会获得self.selectionButton 的内容,我假设它显示一个“S”。这意味着无论发生什么,您都将更多的字母“S”添加到您的数组中。通过像我们一样配置我们的操作方法,它将“self”作为参数传递。这意味着我们有一个变量代表方法中调用该方法的人。我们将使用它来获取我们的内容并将它们添加到数组中。

【讨论】:

感谢您的建议!我会改的【参考方案2】:

在这里做一些事情。首先,您可能不希望按钮成为一个属性,因为您不断地覆盖它并最终留下它引用您创建的最后一个...您基本上所做的与以下内容相同:

int x = 1; x = 2; x = 3;

打印 x 总是会导致 3... 有意义吗?

解决您的问题的方法是将您正在点击的按钮作为 参数 传递给处理该操作的函数,方法是在“didTouchButton”之后添加一个“:”并更改您的方式创建该功能。创建按钮时,在函数名称后添加 : ,如下所示:

[button addTarget:self action:@selector(didTouchButton:)  forControlEvents:UIControlEventTouchUpInside];

这允许将按下的按钮的引用传递给函数,因此您可以这样做来处理它:

- (void)didTouchButton:(UIButton *)button 
    NSString *titleOfPressedButton = button.titleLabel.text;

【讨论】:

非常感谢!实际上我曾经有一次,但我认为它最终不需要它。我错了哈哈,但再次感谢! 不用担心,很高兴为您提供帮助!【参考方案3】:

您需要更改didTouchButton 方法以接受(id)sender 参数,并在创建didTouchButton: 按钮时更改设置选择器的方式。

这样您将在 didTouchButton 内收到一个按钮对象指针,并能够获取其信息。

【讨论】:

以上是关于获取 UIButton 按下的内容的主要内容,如果未能解决你的问题,请参考以下文章

按下和未按下的 UIButton 图像

如何根据按下的 UIButton 重新填充表格视图?

如何在 OBJECTIVE C 的 UITableViewCell 中更改先前按下的 UIButton 标签?

如何在 uicollectionview 单元格中使用 uibutton 操作并获取单元格的内容

按下时如何获取 UIButton 的标题

如何将自定义 UIControl 中按下的 UIButton 传递给我的视图控制器?