我有一个动态的tableView。 TableViewCell原型如下所示:
" ------------------"
标签
segmentedControl(是|否)
TextView的
" ------------------"
我的问题是如何隐藏然后显示textView,tableView可以自动调整其单元格高度
这是我的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
}
}
问题 - 带有问题文本的数组 questionsAnswers - 当我从分段控件中保存值时的数组
对不起,如果我的问题不好,我是ios编程的新手(
答案 0 :(得分:1)
在界面构建器中打开xib。然后按住Ctrl键并将约束拖动到该视图的UIViewController。
对于您的情况,您需要textView
的高度以及segmentedControl
或底部布局之间的间距。
之后只需设置heightConstraint.constant = 0
和spacingConstraint.constant = 0
。
如果您只设置高度为1,则segmentedControl
和底部布局之间会有两个间距,如其他答案所示。
如果您需要再次显示,请确保保存约束常量的初始值,然后将其设置为heightConstraint.constant = initialHeight
和spacingConstraint.constant = initialSpacing
答案 1 :(得分:0)
如果您使用的是自动布局,则可以在文本视图中添加高度约束,并在单元子类中为其添加IBOutlet
。如果要隐藏它,只需将myConstraint.constant
设置为零。
答案 2 :(得分:0)
谢谢大家,我在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)]>" )
我应该改变一些限制吗? 还有一个问题,如果用户点击&#34;否&#34;在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
}
}
只需使用新的问题重新加载tableViewAnswers数组?