使用 UIPickerView 编辑 UIButton 的文本

Posted

技术标签:

【中文标题】使用 UIPickerView 编辑 UIButton 的文本【英文标题】:Edit text of UIButton with UIPickerView 【发布时间】:2014-08-16 19:48:32 【问题描述】:

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

   [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 属性结合使用?如果有,这是如何实现的?

【问题讨论】:

【参考方案1】:

错误很明显:

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

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

而不是:

myButton.titleLabel = picker;

myButton.titleLabel.text = picker;

因为 picker 不是 NSString 对象。

让我稍后解释一下如何实现这个......

在你的 View Controller 类中,创建一个属性(我建议在私有接口中进行),同时实现 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 始终在底部可见。您可以根据需要隐藏/取消隐藏它。或者更好的是,使用动画将其置于屏幕外而不是隐藏。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于使用 UIPickerView 编辑 UIButton 的文本的主要内容,如果未能解决你的问题,请参考以下文章

编辑 UIPickerView

将数据传回UIPickerView

如何使用 monotouch 在 uitableviewcell 中添加 uipickerview 作为子视图?

UITextField - 在键盘和 UIPickerView 之间切换

IOS实现自定义时间UIPickerView Popup问题

UIPickerView 选定行标签颜色