键盘重叠UITableViewController中的文本字段

时间:2015-04-15 15:10:25

标签: ios uitableview swift uitextfield uisplitviewcontroller

UITableViewController自动管理文本字段编辑:滚动到可编辑内容,同时更改插图以在屏幕上显示文本字段和键盘,而不会重复键盘。这是非常酷的功能,因为我不需要编写大量代码来计算新的插图,滚动到内容,检查deviceOrientation是否更改或键盘隐藏等等。

但是当我们使用 SplitViewController 时,该功能失败,在我们添加到root后,控制器自动管理textfield仅在面向Pad的屏幕上工作。我认为这是Apple的错误,但也许这是我的错误,我做错了什么?我已经检查过SplitViewController - >导航控制器 - > Apple的HID中的UITableViewController层次结构是正确的。

我已经为这个问题编写了简单的应用程序,所以你可以看到这个bug,如何修复它?

使用该错误链接到简单,新鲜的XCode项目:https://www.dropbox.com/s/o315awgonzeskeo/TableEditing.zip?dl=0

SplitViewFresh

半解决方案:如果设备是iPhone,则删除SplitViewController。一切都在iPad上运行正常,但不适用于iPhone,所以我们可以尝试:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let rootController = storyboard.instantiateViewControllerWithIdentifier("navigation") as! UINavigationController
    if UIDevice.currentDevice().userInterfaceIdiom != .Pad {
        // setting non-split rootView if device is iPhone
        self.window!.rootViewController = rootController
    }
}

但是有问题 - 我们在iPhone 6 Plus上丢失了SplitViewController(我检查过,在iPhone 6 Plus上纵向方向键盘仍然重叠,在风景上都可以)。所以这不是解决方案。

5 个答案:

答案 0 :(得分:0)

只需设置内容大小

即可增加tableview高度
tableView.contentSize = CGSizeMake(widthYouWant, heightYouWant);

或tableview底部内容来自nib的tableview的frame部分的Insets。然后通过调用

将该行滚动到顶部
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

让我知道这是你的; r寻找

答案 1 :(得分:0)

尝试在您UITableViewController中设置此代码:

  -(void)viewWillAppear:(BOOL)animated 
  {
     [super viewWillAppear:YES]; 
  }
  

注意:UITableViewController在iOS 3.0中具有新功能。一个   table-view controller支持对表视图行进行内联编辑;如果,   例如,行在编辑模式下嵌入了文本字段   滚动正在虚拟键盘上方编辑的行

答案 2 :(得分:0)

您可以尝试将TPKeyboardAvoiding添加到项目中

TPKeyboardAvoiding - 一种插入式通用解决方案,用于在iOS中将文本字段移出键盘。

要与UITableViewController类一起使用,请将TPKeyboardAvoidingTableView.m和TPKeyboardAvoidingTableView.h拖放到项目中,并使您的UITableView成为xib中的TPKeyboardAvoidingTableView。

答案 3 :(得分:0)

作为选项,您可以订阅键盘通知,例如:

[[NSNotificationCenter defaultCenter] addObserver:self
                                  selector:@selector(keyboardWillShow:)
                                    name:UIKeyboardWillShowNotification
                                  object:self.view.window];

[[NSNotificationCenter defaultCenter] addObserver:self
                                  selector:@selector(keyboardWillHide:)
                                    name:UIKeyboardWillHideNotification
                                  object:self.view.window];

然后当键盘即将显示时,会在一定数量的像素上移动您的视图,因此最后一行是可见的。键盘隐藏时 - 将其向下移动。

答案 4 :(得分:0)

处理此类情况的最佳方法是手动控制static <A,B,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, BiFunction<? super A,? super B,? extends R> f) static <A,B,C,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, TriFunction<? super A,? super B,? super C,? extends R> f) static <A,B,C,D,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, TetraFunction<? super A,? super B,? super C,? super D,? extends R> f) static <A,B,C,D,E,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, ObservableValue<E> src5, PentaFunction<? super A,? super B,? super C,? super D,? super E,? extends R> f) static <A,B,C,D,E,F,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, ObservableValue<E> src5, ObservableValue<F> src6, HexaFunction<? super A,? super B,? super C,? super D,? super E,? super F,? extends R> f) 并将其移至键盘上方。我为它创建了small class,如果键盘出现/消失,它会增加和减少约束的大小(可能是从UITableView到视图底部的约束)。