带有自定义 UITextView 单元格的 TableView 将导航栏滚动到屏幕外

Posted

技术标签:

【中文标题】带有自定义 UITextView 单元格的 TableView 将导航栏滚动到屏幕外【英文标题】:TableView with custom UITextView cells scrolling Navbar off screen 【发布时间】:2013-01-04 02:39:24 【问题描述】:

我正在编写一个具有分组 tableView 的应用程序,该应用程序具有包含 UITextViews 在模态 segue 中的自定义单元格。我希望能够编辑每个单元格/文本视图中的文本。我的问题是滚动视图底部的单元格/文本视图,以便它们出现时出现在键盘上方。

编辑:在 cmets 中要求 prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"update info"]) 
        UpdatesTableViewController *uvc = (UpdatesTableViewController *)segue.destinationViewController;
        uvc.dumpInfo = self.dumpInfo;
    

如果我使用 UITableView 控制器,一切都会很好 - 当 textview 成为 firstResponder 时,每个单元格/文本视图都会向上滚动到视图顶部,以便在编辑时可以看到它。但是当tableView滚动时,我添加到tableView顶部的导航栏会滚动。

如果我使用 UIViewController 并添加导航栏和表格视图,我可以使用 UITableView scrollToRowAtIndexPath:atScrollPosition:animated: 方法让它向上滚动单元格。并且导航栏保持固定。但是底部的单元格不能向上滚动到足以显示的高度。

- (void)textViewDidBeginEditing:(UITextView *)textView

    CGPoint location = [textView.superview convertPoint:textView.center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition: UITableViewScrollPositionTop animated:YES];

UITableView 控制器正在做一些很酷的魔法来完成这项工作——我想做的就是将导航栏固定在视图顶部的位置。

【问题讨论】:

如何添加导航栏?当您使用导航控制器推送您的视图控制器时,它应该默认出现。 它是一个模态序列,所以没有导航栏。 在这种情况下,你不能把这个 tableviewcontroller 作为 rootviewcontrollerUINavigationController 并显示带有模型 segue 的导航控制器吗? 我会插话:setDumpInfo 可能发生在您的 prepareForSegue 方法中。您在嵌入视图控制器的导航控制器上调用它。您需要获取 UINavigationController 的 rootViewController 并在其上设置属性。 如果您将 UINavigationController 作为您的 rootViewController,那么正如您在崩溃日志中看到的那样,您的 segue.destinationViewController 是 UINavigationController 而不是 UpdatesTableViewController。您需要从 UINavigationController 的 viewControllers 数组的第 0 个索引处获取 viewController 并为其设置 dumpInfo。 【参考方案1】:

您可以使用 UITableViewController 包裹在 UINavigationController 中,如我的 cmets 中所述。这将在屏幕上显示默认导航栏,并且不会与 tableview 一起滚动。 UITableViewController 需要设置为UINavigationController 的rootViewController。

由于您作为[UINavigationController setDumpInfo:]: unrecognized selector sent to instance 面临崩溃,您需要将您的 prepareForSegue 方法更改为,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    if ([segue.identifier isEqualToString:@"update info"]) 
        UINavigationController *nav = (UINavigationController *)segue.destinationViewController;
        UpdatesTableViewController *uvc = (UpdatesTableViewController *)nav.topViewController;
        uvc.dumpInfo = self.dumpInfo;
    

在这种情况下,基本上dumpInfo 是在navigationController 而不是你的tableviewcontroller 上调用的。

【讨论】:

以上是关于带有自定义 UITextView 单元格的 TableView 将导航栏滚动到屏幕外的主要内容,如果未能解决你的问题,请参考以下文章

通过 UITextView 内容大小调整 UITableView 单元格的大小

如何将 UITextView 嵌入 UITableViewCell 与作为委托的自定义单元格?

带有自定义表格视图单元格的表格视图在滚动时消失

iOS:通过自定义 UITableViewCell 上的 UITextView 进行选择

使用自动布局自定义集合视图单元格的动态高度

带有自定义单元格的 UITableView