一行中的一组单选按钮,同时选择一行中的一个单选按钮,它会影响另一行目标-c

Posted

技术标签:

【中文标题】一行中的一组单选按钮,同时选择一行中的一个单选按钮,它会影响另一行目标-c【英文标题】:Group of radio buttons in one row while selecting one radio button in one row its effecting another row-objective-c 【发布时间】:2017-02-27 05:18:35 【问题描述】:

我的应用有一个选择题和答案类型屏幕。

为此,我设计了带有 UITableView 的屏幕,即,我连续使用四个单选按钮获得了四个答案。 我的确切问题是,如果当我在一行中选择一个单选按钮时,它会自动选择另一行以及我之前选择的内容。第 1 行中的示例我选择了 option2 单选按钮,然后这里它也会自动选择另一行 option2。

我已经尝试了下面的代码,请帮助我。 提前致谢。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
   cell = [_tableViewRef dequeueReusableCellWithIdentifier:@"cell"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSString *rowNumber = [NSString stringWithFormat:@"%ld",(long)indexPath.row+1];
     [[cell questionLbl] setText:[NSString stringWithFormat:@"%@. %@",rowNumber,@"Provide your own fixed background behind the UITableView?"]];
    
  
    [cell.option1RadioBtn addTarget:self
                 action:@selector(radioBtnn1Action:)
       forControlEvents:UIControlEventTouchUpInside];
    [cell.option2RadioBtn addTarget:self
                             action:@selector(radioBtnn2Action:)
                   forControlEvents:UIControlEventTouchUpInside];
    [cell.option3RadioBtn addTarget:self
                             action:@selector(radioBtnn3Action:)
                   forControlEvents:UIControlEventTouchUpInside];
    [cell.option4RadioBtn addTarget:self
                             action:@selector(radioBtnn4Action:)
                   forControlEvents:UIControlEventTouchUpInside];
        return cell;

在单选按钮操作中,我尝试了以下代码:

-(void)radioBtnn1Action:(UIButton*)sender

   
    CGPoint center= sender.center;
    CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.tableViewRef];
    NSIndexPath *indexPath = [self.tableViewRef indexPathForRowAtPoint:rootViewPoint];
    cell = [self.tableViewRef cellForRowAtIndexPath:indexPath];
    


    if ([cell.option1RadioBtn isSelected]) 
        [cell.option1RadioBtn setSelected:YES];
        
        [cell.option2RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];

    
    else
    
        [cell.option1RadioBtn setSelected:YES];
        
        [cell.option2RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];

    

    
    
    

-(void)radioBtnn2Action:(UIButton*)sender

    
    CGPoint center= sender.center;
    CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.tableViewRef];
    NSIndexPath *indexPath = [self.tableViewRef indexPathForRowAtPoint:rootViewPoint];
    cell = [self.tableViewRef cellForRowAtIndexPath:indexPath];
    

    if ([cell.option2RadioBtn isSelected]) 
        [cell.option2RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];
        
    
    else
    
        [cell.option2RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];
        
    
    
    

-(void)radioBtnn3Action:(UIButton*)sender

    
    CGPoint center= sender.center;
    CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.tableViewRef];
    NSIndexPath *indexPath = [self.tableViewRef indexPathForRowAtPoint:rootViewPoint];
    cell = [self.tableViewRef cellForRowAtIndexPath:indexPath];
    

    if ([cell.option3RadioBtn isSelected]) 
        [cell.option3RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option2RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];
        
    
    else
    
        [cell.option3RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option2RadioBtn setSelected:NO];
        [cell.option4RadioBtn setSelected:NO];
        
    
    
    

-(void)radioBtnn4Action:(UIButton*)sender

    
    CGPoint center= sender.center;
    CGPoint rootViewPoint = [sender.superview convertPoint:center toView:self.tableViewRef];
    NSIndexPath *indexPath = [self.tableViewRef indexPathForRowAtPoint:rootViewPoint];
    cell = [self.tableViewRef cellForRowAtIndexPath:indexPath];
    if ([cell.option4RadioBtn isSelected]) 
        [cell.option4RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option2RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        
    
    else
    
        [cell.option4RadioBtn setSelected:YES];
        
        [cell.option1RadioBtn setSelected:NO];
        [cell.option2RadioBtn setSelected:NO];
        [cell.option3RadioBtn setSelected:NO];
        
    
    
    

【问题讨论】:

您应该为单选按钮使用标签。像这个:=> option1RadioBtn.tag = 1 依此类推。并且 radioBtnn1Action 函数验证 option1RadioBtn.tag == 1 是否像这样。 嘿@iParesh 感谢您的回复,请您在此处发布一些代码sn-p。 你需要创建一个nsmutablearray而不是默认添加4个单选按钮值0.hwen用户可以为特定单选按钮索引值选择任何一个设置1个值,因为这个问题是tableview reusablecell问题 嘿@Jigar,谢谢,这里有一些代码 @Sajida 检查此***.com/questions/35402287/…。在这个问题中你有一些想法。如果有任何问题,请告诉我 【参考方案1】:

您的代码中有很多地方可以改进,而小事情也可能导致这种行为。我正在发布您的代码并进行修改。请用我的替换你的代码块。您的代码中的问题是您全局声明了单元格并引用了全局声明的表格视图。在通过单击按钮检测单元格的情况下,我希望您做的最有效的改进。你不需要这么多代码来实现这一点。让我们开始吧。

为了保持选择状态,我们将使用数组 sectionData。

将此代码添加到加载函数中。

for (int index = 0; index < 10; index ++) //taken 10 because you are using only 10 rows
    [sectionData addObject:@"0"];

完全替换以下函数的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSString *rowNumber = [NSString stringWithFormat:@"%ld",(long)indexPath.row+1];
    [[cell questionLbl] setText:[NSString stringWithFormat:@"%@. %@",rowNumber,@"Provide your own fixed background behind the UITableView?"]];

    [cell.option1RadioBtn setSelected:([[sectionData objectAtIndex:indexPath.row] isEqualToString:@"1"])];
    [cell.option2RadioBtn setSelected:([[sectionData objectAtIndex:indexPath.row] isEqualToString:@"2"])];
    [cell.option3RadioBtn setSelected:([[sectionData objectAtIndex:indexPath.row] isEqualToString:@"3"])];
    [cell.option4RadioBtn setSelected:([[sectionData objectAtIndex:indexPath.row] isEqualToString:@"4"])];

    cell.option1RadioBtn.indexPath = indexPath;
    cell.option2RadioBtn.indexPath = indexPath;
    cell.option3RadioBtn.indexPath = indexPath;
    cell.option4RadioBtn.indexPath = indexPath;

    [cell.option1RadioBtn addTarget:self action:@selector(radioBtnnAction:) forControlEvents:UIControlEventTouchUpInside];
    [cell.option2RadioBtn addTarget:self action:@selector(radioBtnnAction:) forControlEvents:UIControlEventTouchUpInside];
    [cell.option3RadioBtn addTarget:self action:@selector(radioBtnnAction:) forControlEvents:UIControlEventTouchUpInside];
    [cell.option4RadioBtn addTarget:self action:@selector(radioBtnnAction:) forControlEvents:UIControlEventTouchUpInside];
        return cell;

你可以看到我只在函数内部使用变量的引用。而且我只将目标作为 1 个功能。现在您需要做的技巧是创建 UIButton 的子类并将其命名为 CustomButton。对于我将 indexPath 分配给按钮属性的行,请参见上面的内容。 不要忘记更改 UITableViewCell 的故事板和类文件中的 Outlet 和 Element 的类。

自定义按钮的 .h 文件。

@interface CustomButton : UIButton

@property (nonatomic, strong) NSIndexPath *indexPath;

@end

现在您的目标函数将如下所示。

- (void)radioBtnnAction:(CustomButton*)sender

    UITableViewCell *cell = [self.tableViewRef cellForRowAtIndexPath:sender.indexPath];
   
    [sectionData replaceObjectAtIndex:sender.indexPath.row withObject:((sender == cell.option1RadioBtn)?@"1":(sender == cell.option2RadioBtn)?@"2":(sender == cell.option3RadioBtn)?@"3":@"4")];

    [cell.option1RadioBtn setSelected:(sender == cell.option1RadioBtn)];
    [cell.option2RadioBtn setSelected:(sender == cell.option2RadioBtn)];
    [cell.option3RadioBtn setSelected:(sender == cell.option3RadioBtn)];
    [cell.option4RadioBtn setSelected:(sender == cell.option4RadioBtn)];

我希望我已经包含了所有内容。尝试一次。

【讨论】:

我在我的代码中遗漏了一些东西。我已经编辑了答案。请使用 cellForRowAtIndexPath 的最新代码块 嗨,谢谢,但在这里 [cell.option1RadioBtn setIndexPath:indexPath];显示一些错误,例如 *no visible@interface for "UIButton" 声明选择器 'setIndexpath' * 请参考答案中的粗线。我提到你将这些按钮的类更改为 CustomButton。 我也编辑了相同的块以便更好地理解。再次复制 cellForRowAtIndexPath 代码。 嘿,谢谢,我已经尝试过您的代码,但问题仍然像以前一样,当我在一行中选择一个单选按钮时,它会自动选择另一行以及我之前选择的内容。【参考方案2】:

您似乎已经有一个自定义单元格。

而不是在单元格上暴露标签 questionLbl。 让单元格采用问题模型。 该模型可能类似于

类 QuestionModel 财产问题 属性选择

您的单元格有一个属性 = questionModel AND 处理按钮选择。因此,当您使用单元格属性设置器分配问题模型时,您也设置了按钮状态。在更新问题模型选择属性的单元格中有按钮目标/动作调用方法。

您在 tableView 源中设置 cell.question 而不是直接设置标签。

底线是,单元应该处理模型而不是视图控制器。它只是将模型传递给单元格。

【讨论】:

在重新阅读您的问题时,问题模型应该包括作为属性的答案,甚至可能是一个数组。关键是,QuestionModel 应该具有显示状态和记录状态更改所需的所有信息。

以上是关于一行中的一组单选按钮,同时选择一行中的一个单选按钮,它会影响另一行目标-c的主要内容,如果未能解决你的问题,请参考以下文章

如何居中对齐测验标题中心下方的一组单选按钮并保持响应?

如何在 Flutter 中只选择一组单选按钮的值?

在 WinForms 中对一组单选按钮进行数据绑定的最佳方法

jQuery使用数据目标更改带有onClick侦听器的一组单选按钮标签的innerHtml

如何在UnChecked时触发单选按钮的OnChange事件

如何指示需要一组单选按钮[重复]