继承 UIPickerView 并添加 UIToolbar

Posted

技术标签:

【中文标题】继承 UIPickerView 并添加 UIToolbar【英文标题】:Subclassing UIPickerView and add UIToolbar 【发布时间】:2013-08-14 13:55:39 【问题描述】:

我正在尝试创建 UIPickerView 的子类并在选择器上方添加 UIToolbar。 我在这里和那里阅读了几篇帖子,但我发现大多数人建议创建一个视图并在其上添加选择器和工具栏。 (或使用 UIActionSheet)

这是我迄今为止尝试过的。

CU_PICKERView 是 UIPickerView 的子类 我尝试使用 inputView 和 inputAccessoryView 这已经是 pickerview 的属性

@interface CU_PICKERView : UIPickerView
@property (strong, readwrite) UIView * inputView;
@property (strong, readwrite) UIView * inputAccessoryView;

-(void)showWithAnimation:(BOOL)flag;
-(void)hideWithAnimation:(BOOL)flag;
@end

下面是CU_PICKERView.m

- (id)init

    self = [super init];
    if (self)
    
        [self setToolbar];
        [self becomeFirstResponder];
    
    return self;


-(void)setToolbar

    _toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    [_toolbar setBarStyle:UIBarStyleDefault];

    UIBarButtonItem * btnCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(barbtnPressed:)];
    [btnCancel setTag:TOOLBAR_BTN_CANCEL];
    [btnCancel setStyle:UIBarButtonItemStyleBordered];

    NSArray * btnArray = [[NSArray alloc] initWithObjects:btnCancel, nil];
    [_toolbar setItems:btnArray];

    self.inputAccessoryView = _toolbar;
    self.inputView = self;


-(BOOL)canBecomeFirstResponder

    return true;


-(void)barbtnPressed:(id)sender

    TOOLBAR_TAG tag = [sender tag];
    switch (tag) 
        case TOOLBAR_BTN_CANCEL:
        
            [self hideWithAnimation:YES];
            break;
        
        default:
            break;
    

从这里开始是奇怪的点。我像往常一样创建了一个 CU_PickerView 的实例。

OtherViewController.m

- (void)viewDidLoad

    [super viewDidLoad];
    [self setPicker];


-(void)setPicker

    _picker = [[CU_PICKERView alloc] init];
    [_picker setShowsSelectionIndicator:YES];
    [self.view addSubview:_picker];

它似乎工作得很好。 showWithAnimation 和 hideWithAnimation 效果很好。

我在 OtherViewController 上创建了一个按钮,并尝试使用该按钮来创建和显示 CUPICKERView。我只是将 setPicker 方法移动到按钮事件处理程序,但它不起作用。我不能让 inputAccessoryView 显示出来。

我尝试调用 [_picker becomeFirstResponder] 但没有成功。

关于 inputAccessoryView 有什么我遗漏的吗?

我解决了它。在 viewDidLoad 中调用 setPicker 并将其隐藏在 viewDidAppear 中。

【问题讨论】:

这是我目前发现的。当我在 viewDidLoad 中调用 setPicker 时,即使我在 self.view 上添加了选择器,选择器的超级视图也是 UIPeripheralHostView。但是我调用 setPicker 而不是 viewDidLoad(如按钮事件处理程序),它的超级视图是 self.view。我不明白为什么...... 如果您找到了答案,您可以将其作为答案发布,然后接受。这样,当其他人看到它时,他们可以看到它已经解决(甚至可能将您的答案用于他们自己的问题)。 我不确定这是否是正确的解决方案。经过几次测试,我会用更详细的代码来回答。 【参考方案1】:

好的,现在我弄清楚为什么很多人建议创建一个视图并在其上添加选择器和工具栏。

经过多次测试,使用 USPeripheralHostView 比仅使用视图(选择器+工具栏)复杂。而且我不确定 Apple 是否允许这样做。

【讨论】:

以上是关于继承 UIPickerView 并添加 UIToolbar的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 UIPickerView 的动画持续时间?

UIPickerView的使用

如何将列添加到预先存在的 uipickerview

如何将带有完成按钮的工具栏添加到 UIPickerView?

iOS开发之基础视图—— UIPickerView

用UIPickerView来显示省和市