0

我添加UITextView了一个子视图UIAlertView,我添加UIToolBar了一个完成按钮(使用UIBarButtonIteminputAccessoryView以允许用户退出键盘`。它在 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中辞职

任何的想法?怎么了?

4

3 回答 3

1

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

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

[textField resignFirstResponder];
[alertView resignFirstResponder];

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

于 2013-10-17T12:14:19.577 回答
0

我已经解决了它,作为@iOS Developer给出的解决方案,但是由于我有很多UIAlertView对象要处理,所以我添加了一个indelegate的属性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;
}
于 2013-10-17T13:57:26.943 回答
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;
}
于 2013-10-23T12:07:53.313 回答