So I'm attempting to build a single screen app where I start with a UIViewController. On top of that there is a UITextfield, a button, and a UITableView.
Essentially the intended functionality of the app is for a user to type a word into the UITextField, hit a button, and have it show up on the UITableView.
I never have problems doing this when the the button appends the UITextField entries to a UITableViewController on a different screen, but for some reason I'm having problems with a UITableView embedded on the UIViewController... On my storyboard I did link the UITableView as a delegate and datasource of the UIViewController so that shouldn't be the problem.
Any ideas? My code is posted below.
import UIKit
var groupList:[String] = []
class ExistingGroups: UIViewController,  UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource
{
@IBOutlet weak var addGroup: UITextField!
@IBAction func addGroupButton(sender: AnyObject) {
    self.view.endEditing(true)
    var error = ""
    if addGroup.text == "" {
        error = "Please enter a Group!"
    } else {
        groupList.append(addGroup.text)
    }
    if error != "" {
        var alert = UIAlertController(title:"Error In Form", message: error, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title:"OK", style: .Default, handler: { action in
            self.dismissViewControllerAnimated(true, completion:nil)
        }))
        self.presentViewController(alert, animated:true, completion:nil)
    }
    addGroup.text = ""
}
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    addGroup.placeholder = "Enter Group Name"
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override func touchesBegan(touches:NSSet, withEvent event:UIEvent)
{
    super.touchesBegan(touches, withEvent: event)
    self.view.endEditing(true)
}
func textFieldShouldReturn(textField: UITextField!) -> Bool // called when 'return' key pressed. return NO to ignore.
{
    textField.resignFirstResponder()
    return true;
}
func tableView(tableView:UITableView, numberOfRowsInSection section: Int) -> Int {
    return groupList.count
}
func numberOfSectionsInTableView(tableView:UITableView) -> Int {
    return 1
}
func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("groupcell") as UITableViewCell
    cell.textLabel?.text = groupList[indexPath.row]
    return cell
}
}
                There are two main base ways to populate a tableview. The more popular is through Interface Building, using a prototype cell UI object. The other is strictly through code when you don't need a prototype cell from Interface Builder.
A view that presents data using rows in a single column.
First of all create an IBOutlet for your table view this way :
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {
var groupList = [String]()
@IBOutlet weak var addGroup: UITextField!
@IBOutlet weak var tableView: UITableView!  //<<-- TableView Outlet
// Rest of your code..
}
After that do this in your viewDidLoad method:
override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "groupcell")
    self.addGroup.delegate = self
    tableView.delegate = self
    tableView.dataSource = self
}
After that you can reload your tableView once the element is added into groupList. Here you can do this:
@IBAction func addGroupButton(sender: AnyObject) {
    // Your Code
    } else {
        groupList.append(addGroup.text)
        self.tableView.reloadData()
    }
   //Your Code
}
And Update this function:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("groupcell", forIndexPath: indexPath) as UITableViewCell
    cell.textLabel.text = self.groupList[indexPath.row]
    return cell
}
And you can check final code which I created for you is HERE.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With