我有一个带有Add cell ...行的UITableView,并希望弹出一个带有上方视图的键盘,就像在“Messages”应用程序中一样,用户可以在其中键入新单元格的名称。 / p>
我意识到还有其他几种获取用户数据的方法,以及实现我想要实现的功能的几种方法。
例如,当应创建新的播放列表时,iPod应用程序会显示一个弹出窗口。
现在,我有一个隐藏的文本字段,当按下Add cell ...行时,它被设置为第一个响应者,我将包含输入字段和确认按钮的视图指定为此隐藏字段的inputAccessoryView 。或者,我可以将此视图添加为表格的子视图,并使用键盘通知进行定位。
我只想知道是否有更简洁的方法来完成我想要做的事情(例如将输入textField的inputAccessoryView设置为textField的superview)。我尝试了几种方法,但是当视图关闭时,我似乎无法使用resignFirstResponder关闭键盘。我可以让inputAccessoryView消失,但键盘仍然坚决打开,占用必要的屏幕空间。此外,当nib的视图是一个UITableView,UITableViewController作为文件的所有者,而不是UIView与UIViewController作为文件的所有者时,我得到一个非常奇怪的错误:“设置表的第一个响应者视图,但我们不知道它的类型(单元格/页眉/页脚)“
提前致谢, Julian Ceipek
答案 0 :(得分:2)
您使用UITextView / UITextField类上的setInputAccessoryView
走在正确的轨道上'此方法允许您将所需的任何视图添加到键盘顶部。
您创建的视图将使用委托方法告诉主视图控制器resignFirstResponder。
所以,为了让你开始:
@protocol TextFieldAccessoryViewDelegate
@required
- (void)keyboardShouldDismiss;
@end
@interface TextFieldAccessoryView : UIView
@property (nonatomic, retain) id<TextFieldAccessoryViewDelegate> delegate;
- (id)initWithFrame:(CGRect)frame withDelegate (id<TextFieldAccessoryViewDelegate>)aDelegate;
@end
实现可能看起来有点像(仅发布构成视图的代码):
#pragma mark - Private methods
- (void)doneButtonTapped:(id)sender
{
[delegate keyboardShouldDismiss];
}
- (void)setUpChildrenView
{
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonTapped:)];
UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@""];
[navigationItem setRightBarButtonItem:doneButton];
[navigationItem setHidesBackButton:YES];
UINavigationBar *navigationBar = [[[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.width, 44.0f)] autorelease];
[navigationBar pushNavigationItem:navigationItem animated:NO];
[self addSubview:navigationBar];
}
我使用了标准的NavigationBar外观视图,但您可以放入任何您喜欢的内容,包括按钮,文本字段,机器人独角兽图像,作品
如果你没有得到上述代码中的所有内容,你可能需要刷新委托并以编程方式创建视图。
答案 1 :(得分:0)
- (void)viewDidLoad
{
[self createAccessoryView];
[textField setDelegate:self];
[textField setKeyboardType:UIKeyboardTypeDefault];
[textField setInputAccessoryView:fieldAccessoryView];
}
- (void)createAccessoryView
{
CGRect frame = CGRectMake(0.0, self.view.bounds.size.height, self.view.bounds.size.width, 44.0);
fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame];
fieldAccessoryView.barStyle = UIBarStyleBlackOpaque;
fieldAccessoryView.tag = 200;
[fieldAccessoryView setBarStyle:UIBarStyleBlack];
UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]];
[segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
[segmentedControl setMomentary:YES];
UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];
[fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO];
[segmentButton release];
[spaceButton release];
[doneButton release];
[segmentedControl release];
}