如何引用驻留在自定义UITableViewCell中的UITextView

时间:2015-01-14 18:49:59

标签: objective-c cocoa-touch uitableview swift

我现在所做的是在我的cellForRowAtIndexPath方法的变量中存储对textView的引用:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("photoCell") as EditProfileTableViewCell

    cell.imageCaption.tag = indexPath.row
    imageCaptionTextView = cell.imageCaption

    imageCaptionTextView.delegate = self

    return cell

}

然后,当我点击键盘上的完成按钮时,我尝试访问textView。

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    checkMaxLength(textView, maxLength: 60)

    if text == "\n" {

        imageCaptionTextView.resignFirstResponder()
        return false
    }
    return true
}

我还有一些其他代码(不包含在这篇文章中),只是在textView周围添加一个边框,以便用户指示textView已被点击。这似乎只适用于第一个textView。我还在textView中添加了一个标签并打印到控制台,但标签返回相同的数字。

很明显我似乎只提到了第一个细胞。我无法使用didSelectRow等,因为此单元格包含一张照片,然后是一个textView,用于添加该图像的标题。

有没有简单的方法来引用我的细胞?我已经查看了堆栈流量上的示例,但它们没有包含足够广泛的示例作为答案。

在此感谢一些帮助。

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

假设您的UITextView被添加为您的单元格contentView的子视图,那么您可以通过执行此操作来访问封闭的UITableViewCell

UITableViewCell* cell = (id)textField.superview.superview;

或:

let cell = cell.superview.superview as UITableViewCell?

这依赖于contentViewUITableViewCell的子视图的假设,其在iOS 8中是真实的,但可能在将来停止。因此,您可以在那里添加一些检查(例如,使用isKindOfClass),以确保您获得正确的对象类型。

答案 1 :(得分:0)

我认为您可以做的是先获取选定的单元格。 然后,您可以使用标签来访问它。

NSIndexPath *selectedCellIndex = [self.tableView indexPathForSelectedRow];
UITableViewCell *selectedCell = [self.tableView cellForRowAtIndexPath:selectedCellIndex];

然后,你得到你的目标细胞。因此,您可以使用标记来获取 UITextView

以下是谈论UIResponder链的链接:https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html

答案 2 :(得分:0)

UITextViewDelegate具有textViewDidBeginEditingtextViewDidEndEditing的功能。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("photoCell") as EditProfileTableViewCell

    cell.imageCaption.tag = indexPath.row
    cell.imageCaption.delegate = self

    return cell
}

func textViewDidBeginEditing(_ textView: UITextView)
{
    textView. // add border here
}

func textViewDidEndEditing(_ textView: UITextView)
{
   textView.text // will give you final value
   textView.tag will give you the row of the cell.
}

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    checkMaxLength(textView, maxLength: 60)

    if text == "\n" {

        textView.resignFirstResponder()
        return false
    }
    return true
}