【问题标题】:Subclassing UIPickerView and add UIToolbar继承 UIPickerView 并添加 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。我不明白为什么......
  • 如果您找到了答案,您可以将其作为答案发布,然后接受。这样,当其他人看到它时,他们可以看到它已经解决(甚至可能将您的答案用于他们自己的问题)。
  • 我不确定这是否是正确的解决方案。经过几次测试,我会用更详细的代码来回答。

标签: objective-c uipickerview


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多