iOS 中单选按钮的实现

Posted

技术标签:

【中文标题】iOS 中单选按钮的实现【英文标题】:implementation of radio buttons in iOS 【发布时间】:2013-05-02 09:27:48 【问题描述】:

我正在尝试在我的项目中实现单选按钮。由于无法使用现成的控件,因此我创建了简单的按钮并设置了它们的图像,当它们被单击时会发生变化。现在我希望当我单击它们时,应为字符串分配适当的值,然后将其更新到 sqlite 数据库中。代码如下:

婚姻状况单选按钮的方法:

-(IBAction)maritalStatusRadioButton:(id)sender



    if(mMaritalRadioButton.isHighlighted)
    

        [self radioButtonClick:sender];
    

男/女单选按钮的方法:

-(IBAction)genderMaleRadioButton:(id)sender

    if(mMaleRadioButton.isHighlighted)
        mFemaleRadioButton.enabled = NO;

       // [sender setImage: [UIImage imageNamed:@"Radio_button_on.png"]forState:UIControlStateNormal];
        [self radioButtonClick:sender];
    else if (mFemaleRadioButton.isHighlighted)
        mMaleRadioButton.enabled = NO;
        [self radioButtonClick:sender];

    

radioButtonClick 方法:

-(void) radioButtonClick:(id)sender

     [sender setImage: [UIImage imageNamed:@"Radio_button_on.png"]forState:UIControlStateNormal];

更新方法:

-(IBAction)saveUserProfile

    sqlite3_stmt *statement;
    const char *dbpath = [mDatabasePath UTF8String];

    if (sqlite3_open(dbpath, &mDiary) == SQLITE_OK)
    

        NSString *marital = [[NSString alloc]init];  //holds marital status of user
        NSString  *gender = [[NSString alloc]init];  //used to determine if user has entered male or female gender

        if (mMaritalRadioButton.isHighlighted) 
            marital = [NSString stringWithFormat:@"Married"];
        
        else
            marital  = [NSString stringWithFormat:@"Unmarried"];
         
        if(mMaleRadioButton.isHighlighted)
        
            gender = [NSString stringWithFormat:@"Male"];
        else
            gender = [NSString stringWithFormat:@"Female"];
        
        NSString *dummy = [[NSString alloc] initWithFormat:@"%@",self.getUserName];
        //NSLog(@"dummy string is %@",dummy);

        NSString *updateSQL = [NSString stringWithFormat:
                               @"UPDATE USERDETAIL SET mUname = \"%@\", mImage = \"%@\", mGender = \"%@\", mDob = \"%@\", mEmail = \"%@\", mAddress = \"%@\", mLatitude = \"%@\", mLongitude = \"%@\",mMaritalStatus = \"%@\" WHERE mUserName = \"%@\" ", mUname.text, @"", gender, @"", mEmail.text, mAddress.text, mLatitude.text,mLongitude.text,marital, dummy];
               const char *update_stmt = [updateSQL UTF8String];
        sqlite3_prepare_v2(mDiary, update_stmt,
                           -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
       
            mStatus.text = @"user profile updated";
            mUname.text = @"";
           // mPassword.text = @"";
            //mImage.text = @"";
            mGender.text = @"";
            //mDob.date = @"";
            mEmail.text = @"";
            mAddress.text = @"";
            //mMaritalStatus.text = @"";
            mLatitude.text = @"";
            mLongitude.text = @"";


         else 
            mStatus.text = @"Failed to update user profile";
        

        sqlite3_finalize(statement);
        sqlite3_close(mDiary);
    


问题在于saveUserProfile 方法中的条件mMaritalRadioButton.isHighlightedmMaleRadioButton.isHighlighted 永远不会为真。因此,只有女性和未婚者被存储。 Male 和 Married 永远不会被存储。图像变化没有问题。任何人都可以帮助解决它吗? 提前致谢。

【问题讨论】:

【参考方案1】:
//Radio Button : Tap on this each time will toggle its state.


//// Initialization...

UIButton *radioButton = [[UIButton alloc] initWithFrame:CGRectMake(10,10,100,100)];

[radioButton setImage:[UIImage imageNamed:@"unSelected.png"] forState:UIControlStateNormal];

[radioButton setImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];


////// target method 

-(void)on_click_button:(id)sender

  UIButton *button = (UIButton*)sender;

  [button setSelected:!button.isSelected];

  if(button.isSelected)
  
     //Write your code on selected state here...
  
  else
     
        //Write your code on un-selected state here...
     


【讨论】:

forControlState => forState【参考方案2】:

因为isHiglighted 是错误的属性。

Discussion
Returns a Boolean value that indicates whether the control is highlighted when it is drawn. 

重要的部分是绘制时


你需要isSelected

Discussion
Specify YES if the control is selected; otherwise NO. The default is NO. For many controls, this state has no effect on behavior or appearance. But other subclasses (for example, UISwitchControl) or the application object might read or set this control state.

请注意,您必须在 IBAction 中手动设置

【讨论】:

感谢您的回复...但这不起作用。我更改了 radioClickButton 中的状态:[sender setImage: [UIImage imageNamed:@"Radio_button_on.png"]forState:UIControlStateSelected];没有变化..现在图像也没有变化。【参考方案3】:

@Daij-Djan 是对的,你需要isSelected,而不是isHighlighted

isHighlighted 在用户按下按钮但尚未释放触摸时使用。

另外,你不需要每次都像这样改变图像,而是像这样为UIControlStateSelected添加图像:

[button setImage: [UIImage imageNamed:@"Radio_button_on.png"]
        forState: UIControlStateSelected];

【讨论】:

【参考方案4】:

isHighlighted 用于检查临时状态,当您点击按钮时,它会突出显示,表示按钮上会出现蓝色。它是暂时的,所以你不能依赖它。

代替:

if(mMaritalRadioButton.isHighlighted)

使用:

if([[UIImage imageNamed:@"Radio_button_on.png"] isEqual:mMaleRadioButton.currentImage])

【讨论】:

为什么要比较图片?选定的属性就是为此而生的,不是吗!? @Daij-Djan:如果需要使用selected属性,需要在点击的时候将selected属性设置为yes或no。 您不需要创建另一个 UIImage 实例来进行比较。 非常感谢...它现在工作得很好。你能告诉我我的代码到底是什么问题吗? @Crazed'n'Dazed 我们都做过 ^^ isHighlighted 是错误的。它仅用于绘图,不保留。检查图像不是很健壮

以上是关于iOS 中单选按钮的实现的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式更改表格单元格中单选按钮组的单选按钮?

跪求:在ASP中单选按钮怎么用FOR语句输出

在 GridLayout 中居中单选按钮

如何删除表格视图单元格中单选按钮的索引路径?

获得广播组中单选按钮的焦点

嵌套表单中单选按钮的 OnChange 事件