1

我正在开发基于消息的 iPhone 应用程序。我有一个屏幕来回复收到的消息。此屏幕包含两个 UITextView,例如 bottomTextView 和 topTextView。

topTextView 被添加为 bottomTextView 的 InputAccessory 视图

当用户进入屏幕时topTextView必须成为FirstResponder。它正在显示,但光标未放在 topTextView 中。光标位于 textview 中bottomTextView。如何使 topTextView 成为有光标的第一响应者?

这是我尝试过的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];            
    bottomBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 380, 320, 40)];
    bottomBarViewImage.image = [UIImage imageNamed: @"toolbarbg~iphone.png"];
    [bottomBarView addSubview: bottomBarViewImage];
    [self.view addSubview: bottomBarView];

    bottomTextView = [[UITextView alloc] initWithFrame:CGRectMake(35, 7.5, 210, 25)];
    bottomTextView.delegate = self;
    bottomTextView.backgroundColor = [UIColor clearColor];
    bottomTextView.font = [UIFont fontWithName:@"Helvetica" size:14];
    bottomTextView.scrollEnabled = NO;
    [bottomBarView addSubview: bottomTextView];

    topBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 380, 320, 40)];
    topBarViewImage.image = [UIImage imageNamed: @"toolbarbg~iphone.png"];
    [topBarView addSubview: topBarViewImage];

    topTextView = [[UITextView alloc] initWithFrame:CGRectMake(35, 7.5, 210, 25)];
    topTextView.delegate = self;
    topTextView.backgroundColor = [UIColor clearColor];
    topTextView.font = [UIFont fontWithName:@"Helvetica" size:14];
    topTextView.scrollEnabled = NO;
    [topBarView addSubview: topTextView];

    [bottomTextView becomeFirstResponder];
    [bottomTextView setInputAccessoryView: topBarView];
}

-(void) textViewDidBeginEditing:(UITextView *)textView
{
    if(textView == bottomTextView)  
    {
        bottomTextView.scrollEnabled = NO;

        [topTextView becomeFirstResponder];
    }
}

topTextViewwith正在显示,topBarView但光标未放在 topTextView 中。你能帮我解决这个问题吗?提前致谢。

4

1 回答 1

2

我认为这可能是因为您调用[topTextView becomeFirstResponder];了 UITextView 的 delegate textViewDidBeginEditing:。所以 topTextView 只有在您开始编辑时才会成为第一响应者bottomTextView。尝试调用[topTextView becomeFirstResponder];而不是[bottomTextView becomeFirstResponder];在 viewDidLoad 中调用。看看情况如何。我不确定,但becomeFirstResponder可能不会打电话textViewDidBeginEditing:。不确定它会起作用,但值得一试......

编辑 :

我在这里发现了一个相关的问题。可能是因为 textView 没有立即出现,所以它不能成为第一响应者。这是@Tom接受的答案:

我的解决方案:检查键盘(以及附件视图)何时出现!

第 1 步)收听通知(确保在您想要接收通知之前阅读此代码)。

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(changeFirstResponder)
                                             name:UIKeyboardDidShowNotification 
                                           object:nil];

第 2 步)当键盘出现时,您可以将 inputaccessoryview 中的文本字段设置为第一响应者:

-(void)changeFirstResponder
{
    [textField becomeFirstResponder]; //will return TRUE;
}
于 2012-09-17T12:08:04.710 回答