0

我在这里尝试了 Apple 的示例:

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

但是,它似乎不起作用,所以我显然在此过程中遗漏了一些东西,只是不知道是什么。

我有一个 ViewController.h 包含:

@interface PreferencesViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, defaultLocationChoice, UITextFieldDelegate, UIScrollViewDelegate>

@property (nonatomic, retain) NSString *defaultLocation;
@property (nonatomic, retain) NSString *defaultTestType;
@property (nonatomic, assign) id <defaultLocationChoice> locationDelegate;
@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, strong) IBOutlet UITextField *locationnameTextField;
@property (nonatomic, strong) IBOutlet UITextField *locationaddressTextField;
@property (strong, nonatomic) IBOutlet UITableView *scrollView;
@property (nonatomic, strong) IBOutlet UITextField *activeField;

.m 文件中都有 Synthesized。

我在 ViewController.m 中有 Apple 代码

- (void)viewDidLoad
{
    NSUserDefaults *sharedPref = [NSUserDefaults standardUserDefaults];
    defaultLocation =[sharedPref stringForKey:@"defaultLocation"];
    defaultTestType =[sharedPref stringForKey:@"defaultTestType"];

    [self registerForKeyboardNotifications];


    self.navigationItem.title = @"Preferences";

    [super viewDidLoad];

}

- (void)registerForKeyboardNotifications

{

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

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
 name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.

- (void)keyboardWasShown:(NSNotification*)aNotification

{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible

    // Your application might not need or want this behavior.

    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;

    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {

        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);

        [scrollView setContentOffset:scrollPoint animated:YES];
    } 
}



// Called when the UIKeyboardWillHideNotification is sent

- (void)keyboardWillBeHidden:(NSNotification*)aNotification

{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField

{
    activeField = textField;
}



- (void)textFieldDidEndEditing:(UITextField *)textField

{
    activeField = nil;
}

包含 TextFields 的单元格在 CellForRowAtIndexPath 中处理如下(未显示完整代码):

  case 2:
            switch (indexPath.row) {
                case 0:

                    prefCell.textLabel.text = @"";
                    prefCell.accessoryType = UITableViewCellAccessoryNone;
                    prefCell.highlighted = NO;
                    locationnameTextField.frame = CGRectMake(5, 12, 300, 30);
                    locationnameTextField.font = [UIFont systemFontOfSize:13.0f];
                    locationnameTextField.placeholder = @"Enter location name i.e. New York, NY";
                    locationnameTextField.delegate = self;
                    locationnameTextField.returnKeyType = UIReturnKeyDone;
                    [prefCell.contentView addSubview:locationnameTextField];

                    break;
                case 1:
                    prefCell.textLabel.text = @"";
                    prefCell.accessoryType = UITableViewCellAccessoryNone;

                    locationaddressTextField.frame = CGRectMake(5, 12, 300, 30);
                     locationaddressTextField.font = [UIFont systemFontOfSize:13.0f];
                    locationaddressTextField.placeholder = @"Enter location address i.e. mcs.newyork.com";
                    locationaddressTextField.clearsOnBeginEditing = YES;
                    locationaddressTextField.delegate = self;
                    locationaddressTextField.returnKeyType = UIReturnKeyDone;

                    [prefCell.contentView addSubview:locationaddressTextField];

                    break;
            }

在运行应用程序时,键盘弹出,没有任何反应。

Apple 的示例是针对 View 的,因此我在上面更改的唯一代码self.view.frame无效self.tableView.frame

我添加了 ScrollView 作为附加项,因为我没有。我的其他带有嵌入式 TableView 的 ViewController 不需要 ScrollView 来滚动。

层次结构如下:

在此处输入图像描述

任何帮助都会很棒,谢谢

4

3 回答 3

1

您必须执行以下操作:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
 [yourTextField resignFirstResponder];
}
于 2013-03-11T13:02:08.527 回答
0

当我注意到文本字段的超级视图时,我正在为同样的问题挠头。如果我是对的,那么您在 tableview 的单元格内有文本字段。

现在,在您的keyboardWasShown:方法中,您正在检查活动文本字段是否隐藏在键盘下,如下所示:

if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
    [scrollView setContentOffset:scrollPoint animated:YES];
} 

在您的情况下,if条件永远不会成立。由于活动文本字段的超级视图是一个单元格,因此activeField.frame.origin将返回一个引用 UITableViewCell 的点,而不是引用您的 UIView。

因此,您需要做的是检查包含活动文本字段的单元格是否隐藏在键盘下,如下所示:

CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, cellForActiveField.frame.origin) ) {
    CGPoint scrollPoint = CGPointMake(0.0, cellForActiveField.frame.origin.y-kbSize.height);
    [scrollView setContentOffset:scrollPoint animated:YES];
} 

要找到包含活动文本字段的单元格,您需要tag在方法中设置文本字段的属性,tableView:cellForIndexPath:然后检查方法中的标记textFieldDidBeginEditing:

有关更多详细信息,请参阅此问题

希望这可以帮助。

于 2013-05-11T19:06:55.223 回答
0

自从找到它,我使用TPKeyboardAvoiding

它工作得很好,而且很容易设置:

  1. 将 UIScrollView 添加到视图控制器的 xib
  2. 将滚动视图的类设置为 TPKeyboardAvoidingScrollView(仍在 xib 中,通过身份检查器)
  3. 将所有控件放在该滚动视图中
于 2014-02-12T20:36:49.983 回答