Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 无法调用UIKeyboardNotifications_Iphone_Ios_Ios6_Uitextfield_Uitextview - Fatal编程技术网

Iphone 无法调用UIKeyboardNotifications

Iphone 无法调用UIKeyboardNotifications,iphone,ios,ios6,uitextfield,uitextview,Iphone,Ios,Ios6,Uitextfield,Uitextview,我在视图中有一个textfield和textview。在文本视图中编辑文本时,我想在键盘上显示工具栏,但在编辑文本字段时,我不想显示工具栏。我正在使用以下代码: - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { [super viewWillAppear:animated]; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

我在视图中有一个textfield和textview。在文本视图中编辑文本时,我想在键盘上显示工具栏,但在编辑文本字段时,我不想显示工具栏。我正在使用以下代码:

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    [super viewWillAppear:animated];

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(keyboardWillShow:)
               name: UIKeyboardWillShowNotification object:nil];
    [nc addObserver:self selector:@selector(keyboardWillHide:)
               name: UIKeyboardWillHideNotification object:nil];
 return YES;
}


我的问题是,当用户试图编辑textfield并直接开始编辑textView时,我们无法为它显示工具栏?在这种情况下,如何在键盘上显示工具栏

您应该使用此委托方法检索UITextField或UITextView的键盘通知

- (void)keyboardWillShow:(NSNotification *)notification
{
    //self.keyboardNotification = notification; //store notification and process on text begin delegate method. 
}

正如前面解释的
UITextField
UITextView
有一个属性
inputAccessoryView
for>iOS3.2,您可以设置所需的任何视图,并显示在键盘顶部。因此,您不需要使用
UINotificationCenter
。下面是实现所需功能的代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIToolbar *keyboardToolbar =[[UIToolbar alloc] initWithFrame:CGRectMake(0,250,320,30)];
    keyboardToolbar.barStyle = UIBarStyleBlackOpaque;
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissKeyboard)];
 
    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    NSArray *items = [[NSArray alloc] initWithObjects:flex,barButtonItem, nil];
    [keyboardToolbar setItems:items];
    self.textView.inputAccessoryView =keyboardToolbar;
}

-(void)dismissKeyboard
{
    [self.textView resignFirstResponder];
}
您只需为您的
UITextView
设置
inputAccessoryView
,以便为
UITextField
显示默认键盘


我希望这会有所帮助。

您已经知道应该使用inputAccessoryView,但以下是代码不起作用的原因:

ui键盘将显示通知
将在
textfield shouldBeginediting:
返回后发布

这是因为您可以通过从
文本字段shouldBeginediting:
返回NO来取消编辑,在这种情况下,不应该有
UIKeyboardWillShowNotification

不要删除
文本字段shouldbeginediting:
中的通知。否则,在发布此通知时,您将不再遵守此通知


如果在
视图中添加通知将出现:
,请在
视图中删除通知将消失:

顺便说一句,为什么要在
文本视图shouldbeginediting
方法中调用
视图将出现
方法?是的,我已经实现了这个方法,但当用户直接从文本字段切换到文本视图时,即使是这个委托方法也不会被调用,因为键盘已经显示。您在哪里设置了
委托
?请咨询您的xib或
self.textView.delegate=self
谢谢各位。。。我忘了添加,但inputAccessoryView帮助解决了我的问题,也帮助我优化了代码。
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIToolbar *keyboardToolbar =[[UIToolbar alloc] initWithFrame:CGRectMake(0,250,320,30)];
    keyboardToolbar.barStyle = UIBarStyleBlackOpaque;
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissKeyboard)];
 
    UIBarButtonItem *flex = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    NSArray *items = [[NSArray alloc] initWithObjects:flex,barButtonItem, nil];
    [keyboardToolbar setItems:items];
    self.textView.inputAccessoryView =keyboardToolbar;
}

-(void)dismissKeyboard
{
    [self.textView resignFirstResponder];
}