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

时间:2015-05-04 10:46:28

标签: ios uitableview swift

我有一个动态的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编程的新手(

3 个答案:

答案 0 :(得分:1)

在界面构建器中打开xib。然后按住Ctrl键并将约束拖动到该视图的UIViewController。

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

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

如果您只设置高度为1,则segmentedControl和底部布局之间会有两个间距,如其他答案所示。

如果您需要再次显示,请确保保存约束常量的初始值,然后将其设置为heightConstraint.constant = initialHeightspacingConstraint.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数组?