当前位置: 首页 > 知识库问答 >
问题:

ios swift显示/隐藏文本视图单元格中的元素并清除其空间

郭思聪
2023-03-14

我有一个动态表视图。表视图单元格原型如下所示:

"------------------"
标签
段控(yes|no)
text View
"------------------"

我的问题是我如何隐藏并显示text View,tableView可以自动调整其单元格高度

这是我的tableViewCell类:

class QuestionTableViewCell: UITableViewCell {

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

这是我的表格View 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
    }
}

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

抱歉,如果我的问题很糟糕,我是ios编程新手(

共有3个答案

龚鸿雪
2023-03-14

谢谢大家,我在tableViewCell类中为text View的高度限制创建了一个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)]>" )

我应该改变一些约束吗?还有一个问题,如果用户在分段控件上单击“否”,我想向用户显示该文本视图。
我可以这样做吗:

// 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
    }
}

只需重新加载tableView与新问题答案数组?

袁俊弼
2023-03-14

如果使用自动布局,可以向文本视图添加高度约束,并在单元格子类中向其添加IBOutlet。只需设置myConstraint。如果要隐藏常量,请将其设置为零。

吴俊晤
2023-03-14

在接口生成器中打开xib。然后按住ctrl键将约束拖动到该视图的UIViewController。

对于您的案例,您需要textView的高度以及segmentedControl

之后,只需设置高度约束常量 = 0间距约束常量 = 0

如果只设置高度1,则segmentedControl和底部布局之间会有两个间距,如其他答案所建议的那样。

如果需要再次显示,只需确保保存约束常量的初始值,然后按如下方式设置它们即可。constant=initialHeight间距约束。常量=初始间距

 类似资料:
  • 问题内容: 按下后如何隐藏“编辑”链接?当我按下编辑键时,是否还可以隐藏“ lorem ipsum”文本? 问题答案:

  • 问题内容: 我第一次弄乱React.js,找不到通过click事件在页面上显示或隐藏内容的方法。我没有在页面上加载任何其他库,所以我正在寻找使用React库的本机方法。到目前为止,这就是我所拥有的。当点击事件触发时,我想显示结果div。 问题答案: 大约在2020年做出反应 在回调中,调用状态挂钩的 setter函数以更新状态并重新渲染: JSFiddle 反应约2014年 关键是使用来更新点击处

  • 本文向大家介绍jQuery控制元素隐藏和显示,包括了jQuery控制元素隐藏和显示的使用技巧和注意事项,需要的朋友参考一下 1、jQuery隐藏和显示效果 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: 2、jQuery淡入淡出效果 通过 jQuery,您可以实现元素的淡入淡出效果。 jQuery 拥有下面四种 fade 方法: fadeIn()

  • 我有一个问题隐藏和显示一个元素取决于一个布尔变量在角2。 这是div要显示和隐藏的代码: 变量已“编辑”,并存储在我的组件中: 元素是隐藏的,当saveTodos函数启动时,会显示元素,但3秒钟后,即使变量返回为false,元素也不会隐藏。为什么?

  • 本文向大家介绍jQuery元素的隐藏与显示实例,包括了jQuery元素的隐藏与显示实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery元素的隐藏与显示的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的jQuery程序设计有所帮助。

  • 我有一个来自服务器的响应,我想把它放到列表中。但是当列表为空时,我需要隐藏这个div容器。例如,如果不在数组中-我想隐藏div。但是我想在ng之后使用bird重复,所以我不能使在上。我可以检查li是否为空,然后隐藏div吗? 普朗克例子 AngularJS ng-重复处理空列表大小写-这是不一样的。如果li是空的,我不想隐藏li,我想在li是空的时候隐藏父元素h1。