Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issues adding UITableView inside a UIViewController in Swift

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
}



}
like image 770
CL8989 Avatar asked Dec 09 '14 06:12

CL8989


People also ask

How do I populate UITableView?

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.

What is UITableView in Swift?

A view that presents data using rows in a single column.


1 Answers

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.

like image 65
Dharmesh Kheni Avatar answered Oct 05 '22 08:10

Dharmesh Kheni