当添加为UIAlertView的子视图时,UITextView不会重新签名

时间:2013-10-17 11:36:54

标签: iphone uitextview uialertview uikeyboard resignfirstresponder

我已将UITextView添加为UIAlertView的子视图,我已添加UIToolBar并使用完成按钮(使用UIBarButtonItem)作为inputAccessoryView允许用户辞职键盘。它在iOS6.0中运行良好。而不是在iOS5.0中。

我已经突破并检查了所有可能的方式,为了重新确认我自己,我已经制作了一个示例项目并在iOS版本中检查了相同的内容,问题是相同的。

这是代码,这对我来说很麻烦,

-(UIToolbar *)accessoryView
{
    if (!accessoryView) {
        accessoryView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0)];

        UIBarButtonItem *btn = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(hideKeyBoard)];

        UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc]
                                          initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                          target:nil
                                          action:nil];

        accessoryView.items = [NSArray arrayWithObjects:flexibleSpace,btn, nil];
        [accessoryView setTintColor:[[UIColor blackColor]colorWithAlphaComponent:0.5]];
    }
    return accessoryView;
}

-(IBAction) showAlertWithTextView: (id) sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithFrame:CGRectMake(0, 50, 320, 200)];
    alert.title = nil;
    alert.message = nil;
    alert.delegate = self;

    //textview I've added in .h file
    textView = [[UITextView alloc] initWithFrame:alert.bounds];
    textView.text = @"This is a UITextView";
    textView.keyboardAppearance = UIKeyboardAppearanceAlert;
    textView.editable = YES;
    textView.inputAccessoryView = [self accessoryView];
    [alert addSubview:textView];
    [alert show];
}

- (void)hideKeyBoard {
   [textview resignFirstResponder];
   //[self.view endEditing:YES]; //this is also not worked
}

以下是我正在做的步骤列表

  1. 使用Textview显示提醒
  2. 专注于Textview
  3. 点击完成按钮以退出TextView
  4. 它不是在iOS5中辞职,而是在iOS6中辞职
  5. 有什么想法吗?出了什么问题?

3 个答案:

答案 0 :(得分:1)

实际上你的textview不是第一个响应者。第一个响应者是你的alertView。

所以你应该试试这个......

[textField resignFirstResponder];
[alertView resignFirstResponder];

要使用此代码,您必须在your.h文件中声明alertView对象

答案 1 :(得分:0)

我已经解决了它,作为@iOS Developer提供的解决方案,但由于我有很多UIAlertView个对象需要处理,我在委托中添加了UIAlertView的属性,并分配了它与我的alertview的对象一样,

-(void)willPresentAlertView:(UIAlertView *)alertView
{
    //set current alertview
    [[AppDelegate sharedDelegate] setCurrentAlertView:alertView];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //will remove current alertview reference
    [[AppDelegate sharedDelegate] setNilCurrentAlertView];
}

- (void)hideKeyBoard {

    [textView resignFirstResponder];
    //when need to resign UITextView, get current alertview object
    UIAlertView *alertView = [[AppDelegate sharedDelegate] getCurrentAlertView];
    if(alertView) {
        [alertView resignFirstResponder];
    }
}

在AppDelegate.m文件中,

#pragma mark - UIAlertView Resign 
- (void) setCurrentAlertView:(UIAlertView *)alert{
    self.alertObj = alert;
}

- (void) setNilCurrentAlertView {
    self.alertObj = nil;
}

- (UIAlertView *)getCurrentAlertView {
    return (UIAlertView *)self.alertObj;
}

答案 2 :(得分:0)

由于时间稍晚但我想知道您的代码无法在iOS7中运行,因为从iOS7开始UIAlertView不允许添加任何子视图(因为您要添加UITextView作为子视图UIAlertView)。

如果您的要求不是强制使用UITextView,那么您可以使用UIAlertView以及警告中默认文本字段的以下配置。

UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Title"
                                                          message:@"Message"
                                                         delegate:self
                                                cancelButtonTitle:@"Cancel"
                                                otherButtonTitles:@"Ok", nil];

        [message setAlertViewStyle:UIAlertViewStylePlainTextInput];
[message show];

您可以像UIAlertView这样的代表获得此文本字段的值,

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
      [alertView textFieldAtIndex:0].text;
}