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 = 0
和 spacingConstraint.constant = 0
。
如果您只设置高度一,您将在 segmentedControl
和底部布局之间有两个间距,正如其他答案中所建议的那样。
如果您需要再次显示它,只需确保保存约束常量的初始值,然后像 heightConstraint.constant = initialHeight
和 spacingConstraint.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 单元格中显示当前股票价格?
iOS - 使用 Swift 在每个表格视图单元格中获取 JSON 提要
Swift Custom UITableViewCell 以编程方式工作并在单元格中显示,但 Storyboard IBOutlet 为 nil 并且不在单元格中显示