iOS:复杂的嵌入式tableview,如何向上滚动单元格进行编辑?

时间:2013-12-03 17:22:51

标签: ios uitableview

我一直在努力解决这个问题超过一周,并在Stackoverflow和互联网上尝试了大量的解决方案,但我似乎没有找到解决方案......

首先,我有一个复杂的视图层次结构。每个视图包含三个子视图。标题,中心和页脚。中心视图包含一个tableview。我喜欢这样,因为我希望页眉和页脚始终可见。

现在我想要检查我的键盘是否隐藏了要编辑的文本字段。如果是这样,滚动表格视图,使文本字段位于表格的顶部,以便更好地进行编辑。

但我无法让它发挥作用。我现在开始编写我自己的类,但现在我在使用框架大小。首先,这是我的代码:

@implementation MovingTextFieldsIntoViewTableView

@synthesize activeField = _activeField;
@synthesize activeCellIndexPath = _activeCellIndexPath;
@synthesize tableFrameInMainView = _tableFrameInMainView;
@synthesize completeScreen = _completeScreen;

#pragma mark move textfield into view
// Call this method somewhere in your view controller setup code.
//If this isn't called the table view acts as a normal table view
// Call this method somewhere in your view controller setup code.
- (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];
    CGRect keyboard = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];

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

    CGRect visiblePartOfScreen = self.completeScreen;
    visiblePartOfScreen.size.height -= keyboard.size.height;

    CGRect rectOfCellInTableView = [self rectForRowAtIndexPath:self.activeCellIndexPath];

    CGFloat textFieldBottomY = self.tableFrameInMainView.origin.y - self.contentOffset.y + rectOfCellInTableView.origin.y + self.activeField.frame.origin.y + self.activeField.frame.size.height;

    NSLog(@"textFieldBottomY: %f", textFieldBottomY);
    NSLog(@"Screen size: %f", self.completeScreen.size.height);
    NSLog(@"keyboar height: %f", keyboard.size.height);
    NSLog(@"visible screen size: %f", visiblePartOfScreen.size.height);


    CGPoint activeFieldBottomY = CGPointMake(self.activeField.frame.origin.x, textFieldBottomY);


    if (CGRectContainsPoint(visiblePartOfScreen, activeFieldBottomY)) {
        NSLog(@"Keyboard does NOT hide textfield");
    } else {
        NSLog(@"Keyboard does hide textfield");
    }
//    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
//        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
//    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
//    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
//    scrollView.contentInset = contentInsets;
//    scrollView.scrollIndicatorInsets = contentInsets;
}

@end

正如您所看到的,我只想先看看我的功能是否正确识别某个文本字段是否隐藏。但这并不完全有效。 问题必须是其中一个属性:

在开始编辑中直接设置activeField(如Apple的示例中所示)。

activeCellIndexPath设置在与活动字段相同的位置(带有文本字段的标记)

tableFrameInMainView:在主视图控制器的相应viewDidLoad方法中,我正在设置与主视图相关的表格框架。这似乎有效,并且给出了与接口构建器中设置的完全相同的值和约束。

completeScreen:这里我希望没有键盘的屏幕可见框架。这个似乎是问题,因为我猜这个有点大(可能是因为导航栏?或者tabbar?)如你所见我需要这个以便找出keyboardSize屏幕的哪一部分(带内容)可见,哪一部分是隐藏的。我如何获得正确的价值?我的内容未延伸到导航栏或标签栏下方。我的意思是在3.5英寸iPhone的模拟器中,键盘大约覆盖了屏幕内容的一半。但是keyBoard高度是216,而我的completeScreen.height记录480 ...

编辑: 我现在检查导航栏的高度,它是0.这是我猜的因为NSLog(@“%@”,self.navigationController);从我的视图控制器得到null ...但是这没有任何意义,因为我的导航控制器正在工作,我已经在XCode Interface Builder中设置了所有内容?!

2 个答案:

答案 0 :(得分:0)

我不确定这是否能彻底解决您的问题,但我可能会给您一些建议。

你的类是继承自UIViewController吗?

我最近遇到了类似的问题,并在1-2小时内通过继承UITableViewController解决了,该类已代表我完成所有工作。 我只是不确定你是否可以这样做,然后添加所有其他视图,但我想这应该是可能的。

在我的情况下,我有一个“+”UIBarButton,当用户点击它时,在表的末尾添加一个包含UITextField的新单元格,文本字段也应该成为第一响应者,以及相应滚动的表视图。这就是我的方式:

- (void)onBarButtonAddFolderTap:(UIBarButtonItem *)sender
{
    PPFolder *newFolder = [[PPFolder alloc] initWithName:@""];

    [[SessionManager sharedManager] addFolder:newFolder];

    NSIndexPath *indexPathForNewFolder = [NSIndexPath indexPathForRow:([[SessionManager sharedManager].folders count] - 1) inSection:0];

    [self.tableViewFolders insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathForNewFolder]
                                 withRowAnimation:UITableViewRowAnimationLeft];

    [self.tableViewFolders scrollToRowAtIndexPath:indexPathForNewFolder atScrollPosition:UITableViewScrollPositionBottom animated:NO];

    PPFolderCell *folderCell = [self cellForRow:indexPathForNewFolder.row];

    [folderCell.textFieldFolderName becomeFirstResponder];
}

尝试继承UITableViewController并执行类似的操作。 我希望以某种方式帮助你:)

答案 1 :(得分:0)

此代码可以帮助您:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 100.0f;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 100.0f;
}

// custom view for header. will be adjusted to default or specified header height
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *viewForHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];

    viewForHeader.backgroundColor = [UIColor orangeColor];

    return viewForHeader;
}

// custom view for footer. will be adjusted to default or specified footer height
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *viewForFooter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];

    viewForFooter.backgroundColor = [UIColor orangeColor];

    return viewForFooter;
}