0

I wish to create UITableView and a custom cell, and add them to my UIViewController.

If I layout UITableView from the storyboard onto my UIViewController, everything works fine with custom cell.

But I realized that animation regarding its height is not very smooth - sometimes the table view disappears

So I decided to create/destroy a UITableView everytime I wish to do some animation, and add it as a subview to my UIViewController.

But the programmatically-added UITableView won't populate data.

What am I doing wrong here?

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var dataArr = [String]() // Holds data for UITableView
var tv: UITableView!     // Notice it's not @Outlet

override func viewDidLoad() {
    super.viewDidLoad()


    dataArr = ["one", "two", "three"]


    // Create and add UITableView as drop down
    tv = UITableView()
    tv.delegate = self
    tv.dataSource = self

    createTableView()
}

func createTableView() {
    let w = UIScreen.mainScreen().bounds.size.width
    tv.frame = CGRectMake(0, 50, w, 0)
    tv.rowHeight = 25.0

    // Register custom cell
    var nib = UINib(nibName: "searchCell", bundle: nil)
    tv.registerNib(nib, forCellReuseIdentifier: "searchCell")

    self.view.addSubview(tv)

    UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.BeginFromCurrentState, animations: {
            self.tv.frame.size.height = 100
        }, completion: { (didFinish) in
            self.tv.reloadData()
        })
}

func destroyTableView() {
    UIView.animateWithDuration(0.2, animations:
        {
            // Hide
            self.tv.frame.size.height = 0
        }, completion: { (didFinish) in
            self.tv.removeFromSuperview()
    })
}

// MARK: - UITableView
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataArr.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: SearchCell = self.tv.dequeueReusableCellWithIdentifier("searchCell") as! SearchCell
    cell.cellLabel.text = dataArr[indexPath.row]
    return cell;
}
}
rmaddy
  • 314,917
  • 42
  • 532
  • 579
Joon. P
  • 2,238
  • 7
  • 26
  • 53

1 Answers1

0

I think the problem is with this line.

self.tv.frame.size.height = 100

Try setting the whole frame instead of just the height. Pretty sure a UIView's Frame's properties are read only.

See here

If that doesn't work. Maybe try implementing

func tableView(_ tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
Community
  • 1
  • 1
JordanC
  • 1,303
  • 12
  • 28