单击 UITextField 时带有工具栏的 UIPickerView

Posted

技术标签:

【中文标题】单击 UITextField 时带有工具栏的 UIPickerView【英文标题】:UIPickerView with toolbar when UITextField is clicked 【发布时间】:2012-07-11 01:49:05 【问题描述】:

我试图在用户单击UITextField 时显示UIPickerView。我还希望UIPickerView 在顶部有一个带有按钮的工具栏,用于提交选择和取消。

我需要在界面生成器中连接UIPickerView,还是在其他地方连接动作?我在构建时也会收到警告。一个警告位于resignFirstResponder 下方。它说:

age 的局部声明隐藏了实例变量

对于不同的变量,还有几个类似于上述警告的警告。

另一个警告是:

“PracticePickerViewController”类未实现“UIActionsheetDelegate”协议。

这是我的.h.m 文件:

.h

#import <UIKit/UIKit.h>

@interface PracticePickerViewController : UIViewController <UITextFieldDelegate>

    IBOutlet UITextField *age;
    IBOutlet UIPickerView *agePickerView;
    IBOutlet UIActionSheet *actionSheet;
    IBOutlet UIToolbar *pickerToolbar;




@end

.m

#import "PracticePickerViewController.h"

@implementation PracticePickerViewController

-(void)textFieldDidBeginEditing:(UITextField *)age
    [age resignFirstResponder];

    actionSheet = [[UIActionSheet alloc] initWithTitle:@"Pick Your Age" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    CGRect pickerFrame = CGRectMake(0,40,0,0);

    UIPickerView *agePickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    agePickerView.showsSelectionIndicator = YES;
    agePickerView.dataSource = self;
    agePickerView.delegate = self;
    [actionSheet addSubview:agePickerView];

    pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,0,320,44)];
    pickerToolbar.barStyle = UIBarStyleBlackOpaque;
    [pickerToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)];
    [barItems addObject:doneBtn];

    UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)];
    [barItems addObject:cancelBtn];

    [pickerToolbar setItems:barItems animated:YES];

    [actionSheet addSubview:pickerToolbar];
    [actionSheet addSubview:agePickerView];
    [actionSheet showInView:self.view];
    [actionSheet setBounds:CGRectMake(0,0,320,485)];


【问题讨论】:

我认为这是ios,对吧? 【参考方案1】:

年龄的局部声明隐藏实例变量

这意味着你定义了一个已经被类变量使用的变量名(所以在这种情况下,你可能在类的某个地方声明了UITextField *age,但你不能重复使用变量名@987654323 @ 在此类中,因为编译器会将其与类变量混淆)。

“PracticePickerViewController”类未实现“UIActionsheetDelegate”协议。

您尚未将 PracticePickerViewController 设为 UIActionsheetDelegate。为此,您需要将界面标题 (PracticePickerViewController.h) 更改为:

@interface PracticePickerViewController : UIViewController <UITextFieldDelegate, UIActionsheetDelegate>

不要忘记实现所需的委托方法!

最后,我强烈建议您查看ActionSheetPicker project。它是一个插入类,具有您想要实现的功能,因此您可以替换您的当前代码,或者仅将其用作参考,以查看如何正确实现 UIPickerView 内的嵌入式 ActionSheet。希望对您有所帮助!

【讨论】:

以上是关于单击 UITextField 时带有工具栏的 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章

遵循 UI Segue 会破坏我的视图框架

带有 UITextfield 的 UItableView 到 NSMutableArray CRASH on Record 更新单击

单击按钮,将UITextField添加到UITableView

带有 UITextField 的 UITableView,滚动错误

单击自定义单元格的 UITextField 后重新加载 TableView

UITextField 和 UIButton 不可点击