2016-01-18 58 views
1

我有可编辑的自定义(nib)加载可重用UITableViewCell s其中包含UITextView。行是自动调整大小的。我有一个问题,如果用户开始编辑UITextView,然后开始滚动焦点(firstResponder)仍然保持,我认为这是一个问题,因为屏幕单元通常允许被删除或重用。这会导致问题,因此该行仍保留在内存中,稍后显示在错误的位置。UITableViewCell中的UITextView ResignFirstResponder滚动出屏幕

我认为这是一个很好的解决方案,当细胞在屏幕外时,请拨打resignFirstResponder来获得UITextView。然而didEndDisplayingCell似乎并没有被要求这种情况。我也尝试过prepareForReuse,它不会被调用。

任何想法?

public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 
{ 
    if (tableView.indexPathsForVisibleRows?.indexOf(indexPath) == nil) { 
     if let noteCell = cell as? AgendaNotesTableViewCell { 
      noteCell.noteTextView.resignFirstResponder() 
     } 
    } 
} 

看起来这适用于除了当前firstResponder之外的所有单元。我想这是保存在内存中,因此不会被用来调用didEndDisplayingCell

回答

0

添加UIGestureRecognizerUITableviewviewDidLoad方法,使用它的委托方法之一UITextView

UITapGestureRecognizer * gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeKeyboard)]; 
    [self.tableView addGestureRecognizer:gesture]; 

保持基准

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

当点击桌面视图时,手势识别器方法调用,即

- (void)removeKeyboard { 
// set resignFirstResponder to textview 
    } 
+0

这不是我想要的。当你触摸'UITableView'上的任何地方时,我假设这段代码隐藏了键盘。当单元格滚动到屏幕可见区域外时,我想隐藏键盘。 – Sunkas

0

我想出了一个解决方案。它工作正常,但如果有人发现更好的一个,我会将其标记为正确的。

我在我的视图控制器中添加了一个变量来跟踪firstResponder UITextView的当前indexPath。每次我开始编辑UITextView我设置变量,在我的viewController这个方法:

private var currentFirstResponderIndexPath:NSIndexPath? = nil 

public func didSetFirstResponderIndexPath(indexPath:NSIndexPath?) 
{ 
    currentFirstResponderIndexPath = indexPath 
} 

在我的自定义UITableViewCell S:

//MARK: - UITextViewDelegate 

public func textViewDidEndEditing(textView: UITextView) 
{ 
    //.... 
    agendaViewController?.didSetFirstResponderIndexPath(nil) 
} 


public func textViewDidBeginEditing(textView: UITextView) 
{ 
    //... 
    agendaViewController?.didSetFirstResponderIndexPath(indexPath) 
} 

其中agendaViewController是弱指针的viewController。这也可以是一个代表。

然后我检查其滚动当前firstResponder时不可见:

//MARK: - UIScrollViewDelegate 

public func scrollViewDidScroll(scrollView: UIScrollView) 
{ 
    updateHelperAlphas() 
    if let indexPath = currentFirstResponderIndexPath { 
     let visibleCellIndexPaths = tableView.indexPathsForVisibleRows ?? [] 
     let indexPathForCellWithFirstResponderIsOutOfScreen = !visibleCellIndexPaths.contains(indexPath) 
     if (indexPathForCellWithFirstResponderIsOutOfScreen) { 
      self.view.endEditing(true) 
     } 
    } 
} 

然而,这种解决方案也有一些缺点。如果开始编辑tableview底部的一行,它将显示键盘并隐藏将退出第一响应者的单元,这将隐藏键盘et.c.那里需要更多的逻辑。