ios swift在textView单元格中显示/隐藏元素并清除其空间

Posted

技术标签:

【中文标题】ios swift在textView单元格中显示/隐藏元素并清除其空间【英文标题】:ios swift show/hide an element in textView cell and clear its space 【发布时间】:2015-05-04 10:46:27 【问题描述】:

我有一个动态的 tableView。 TableViewCell 原型如下所示:

“------” 标签 分段控制(是 | 否) 文本视图 “--------”

我的问题是如何隐藏然后显示 tableView 可以自动调整其单元格高度的 textView

这是我的 tableViewCell 类:

class QuestionTableViewCell: UITableViewCell 

@IBOutlet weak var question: UILabel!
@IBOutlet weak var answer: UISegmentedControl!
@IBOutlet weak var comment: UITextView! 

这是我的 tableView cellForRowAtIndex:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->   UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("QuestionCell", forIndexPath: indexPath) as! QuestionTableViewCell

    cell.question.text = "\(indexPath.row + 1). " + questions[indexPath.row]
    // check answer and set it to segmentedControl and set color
    if questionsAnswers[indexPath.row] == "YES" 
        cell.answer.selectedSegmentIndex = 0
        cell.answer.tintColor = UIColor(hex: 0x42DC5A)
     else 
        cell.answer.selectedSegmentIndex = 1
        cell.answer.tintColor = UIColor(hex: 0xD9393E)
    

    if cell.comment != nil 
        cell.comment.delegate = self
        cell.comment.text = "Add a note if necessary.."
        cell.comment.textColor = UIColor.lightGrayColor()
    

    if questionsAnswers[indexPath.row] == "YES" 
        // here i have to hide cell.comment and its space
     else 
        // here i have to show it if its possible
    

    // pass indexPath.row to action
    cell.answer.tag = indexPath.row
    cell.answer.addTarget(self, action: "valueChanged:", forControlEvents: .ValueChanged)

    return cell


// fires when user taps on segmentedControl
func valueChanged(sender: UISegmentedControl)
    // switch segment and update questionsAnswers array
    switch sender.selectedSegmentIndex 
    case 0:
        questionsAnswers[sender.tag] = "YES"
        sender.tintColor = UIColor(hex: 0x42DC5A)
    case 1:
        questionsAnswers[sender.tag] = "NO"
        sender.tintColor = UIColor(hex: 0xD9393E)
    default:
        break
    

questions - 包含问题文本的数组 questionsAnswers - 当我从分段控件中保存值时的数组

对不起,如果我的问题不好,我是 ios 编程的新手(

【问题讨论】:

为 textView 创建高度约束,并根据偏好将其设置为零或某个值。 【参考方案1】:

在界面生成器中打开 xib。然后 ctrl + 将约束拖动到该视图的 UIViewController。

对于您的情况,您需要textView 的高度和segmentedControl 或底部布局之间的间距。

之后,只需设置您的 heightConstraint.constant = 0spacingConstraint.constant = 0

如果您只设置高度一,您将在 segmentedControl 和底部布局之间有两个间距,正如其他答案中所建议的那样。

如果您需要再次显示它,只需确保保存约束常量的初始值,然后像 heightConstraint.constant = initialHeightspacingConstraint.constant = initialSpacing 一样将它们设置回来

【讨论】:

【参考方案2】:

如果您使用自动布局,您可以在文本视图中添加高度约束,并在您的单元格子类中添加IBOutlet。如果您想隐藏它,只需将myConstraint.constant 设置为零即可。

【讨论】:

【参考方案3】:

谢谢大家,我在 tableViewCell 类中为 textView 的高度约束创建了一个 IBOutlet:

@IBOutlet weak var heightConstraint: NSLayoutConstraint!

然后我替换这段代码:

if questionsAnswers[indexPath.row] == "YES" 
    cell.heightConstraint.constant = 0.0
 else 
    cell.heightConstraint.constant = 70.0

而且效果很好,但我在调试器中得到了这个:

可能至少以下列表中的一个约束是一个 你不想要。试试这个:(1)查看每个约束并尝试 找出你没想到的; (2) 找到添加的代码 不需要的约束或约束并修复它。 (注:如果你看到 NSAutoresizingMaskLayoutConstraints 你不明白的,参考 到 UIView 属性的文档 translatesAutoresizingMaskIntoConstraints)

 "<NSLayoutConstraint:0x7f9fc2f45300 V:[UITextView:0x7f9fc3017a00'Add a note if necessary..'(70)]>",
 "<NSLayoutConstraint:0x7f9fc2df4460 UILabel:0x7f9fc2f40410'3. Question sadsadas das ...'.top == UITableViewCellContentView:0x7f9fc2f402d0.topMargin>",
 "<NSLayoutConstraint:0x7f9fc2df4550 V:[UILabel:0x7f9fc2f40410'3. Question sadsadas das ...']-(NSSpace(8))-[UISegmentedControl:0x7f9fc2f40e20]>",
 "<NSLayoutConstraint:0x7f9fc2df4700 UITextView:0x7f9fc3017a00'Add a note if necessary..'.bottom == UITableViewCellContentView:0x7f9fc2f402d0.bottomMargin>",
 "<NSLayoutConstraint:0x7f9fc2df4750 V:[UISegmentedControl:0x7f9fc2f40e20]-(NSSpace(8))-[UITextView:0x7f9fc3017a00'Add a note if necessary..']>",
 "<NSLayoutConstraint:0x7f9fc2ed5060 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f9fc2f402d0(81.5)]>" )

我应该改变一些约束吗? 还有一个问题,如果用户在 segmentedControl 上单击“否”,我想向用户显示该 textView。 我可以这样做吗:

// pass indexPath.row to action
cell.answer.tag = indexPath.row
cell.answer.addTarget(self, action: "valueChanged:", forControlEvents: .ValueChanged)

// fires when user taps on segmentedControl
func valueChanged(sender: UISegmentedControl)
    // switch segment and update questionsAnswers array
    switch sender.selectedSegmentIndex 
    case 0:
        questionsAnswers[sender.tag] = "YES"
        sender.tintColor = UIColor(hex: 0x42DC5A)
        tableView.reloadData()
    case 1:
        questionsAnswers[sender.tag] = "NO"
        sender.tintColor = UIColor(hex: 0xD9393E)
        tableView.reloadData()
    default:
        break
    

只需用新的 questionsAnswers 数组重新加载 tableView?

【讨论】:

第二部分,是的。你只需要更新你的模型,然后重新加载表格视图。

以上是关于ios swift在textView单元格中显示/隐藏元素并清除其空间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode swift 的 UITableview 单元格中显示当前股票价格?

在 Swift 中的自定义单元格中存储/检索核心数据

iOS - 使用 Swift 在每个表格视图单元格中获取 JSON 提要

Swift 表格视图,在表格视图单元格中播放视频,内存泄漏

Swift Custom UITableViewCell 以编程方式工作并在单元格中显示,但 Storyboard IBOutlet 为 nil 并且不在单元格中显示

是否有类似IQKeyboardManagerSwift的工具在Swift iOS中将UITextView向上移动?