用UIPickerView编辑UIButton的文本



我希望用户能够更改按钮的标题这是我打算做的一个硬编码示例:

   [myButton setTitle:@"B" forState:UIControlStateNormal];

然而,我宁愿用一个UIPicker提示用户,并允许用户从许多选项中进行选择,以便更改标题。

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender {
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleLongPress:)];
    lpgr.minimumPressDuration = 1.0;
   if ([sender.view isKindOfClass:[UIButton class]]) {
      NSLog(@"user has clicked the button%@", sender.view);
      UIButton *myButton = (UIButton *)sender.view;
       UIPickerView *picker = [[UIPickerView alloc] init];
       myButton.titleLabel = picker;
   }
}

在这一点上,我看到一个错误*assignment to readonly property是否有可能使用UIPickerView与UIButton的setTitle属性?如果有,如何做到这一点?

错误很明显:

titleLabel是UIButton类的一个UILabel属性,它是只读的(你不能将它设置为其他值)。您需要使用其标签的text属性:

myButton.titleLabel.text = @"some text";

而不是:

myButton.titleLabel = picker;

myButton.titleLabel.text = picker;

因为picker不是NSString对象

让我在一分钟内解释如何实现这个…

在你的视图控制器类中,创建一个属性(我建议在私有接口中这样做),并实现UIPickerViewDataSource, UIPickerViewDelegate协议:

@interface PPMyViewController () <UIPickerViewDataSource, UIPickerViewDelegate>
@property (nonatomic, strong) UIPickerView *pickerView;
@end

现在,对pickerView属性使用延迟实例化:

- (UIPickerView *)pickerView
{
    if (!_pickerView)
    {
        _pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
        _pickerView.dataSource = self;
        _pickerView.delegate = self;
    }
    return _pickerView;
}
Make sure you add to the main view, you can do it in the viewDidLoad method:
- (void)viewDidLoad
{
   [super viewDidLoad];
   [self.view addSubview:self.pickerView];
}

And implement most of the 2 protocols methods:
#pragma mark - UIPickerViewDataSource Methods
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}
// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return 10;
}
#pragma mark - UIPickerViewDelegate Methods
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;
{
    return 200;
}
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
    return 50;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [NSString stringWithFormat:@"row %d", row];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    NSLog(@"Row %d selected", row);
//    myButton.titleLabel.text = @"text you need depending on row selection";
}

注意,我的代码将使UIPickerView始终在底部可见。您可以根据需要隐藏/取消隐藏它。或者更好的是,使用动画将其定位在屏幕外,而不是隐藏。

您不能像尝试那样做。您需要做的是聆听用户对按钮的点击,然后向用户呈现一个选择器。

有一些开源控件可以简化这一点,比如ActionSheetPicker。

最新更新