0

I have a basic setup where the datePicker shows up when the textfield shows up. I have multiple elements in the table where the datePicker should show up. I know the code works because I created a single view where it worked perfectly. I am new to swift as well. I believe it could be showing up behind my table view. How would I test/fix that? Here is where my datePicker is coded:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet var coursePicker: UIPickerView!
@IBOutlet var courseTextfield: UITextField!
@IBOutlet var playerPicker: UIPickerView!
@IBOutlet var playerTextfield: UITextField!
@IBOutlet var timePicker: UIPickerView!
@IBOutlet var timeTextfield: UITextField!
@IBOutlet weak var dateTextfield: UITextField!

@IBAction func unwindToVC(segue: UIStoryboardSegue) {
    if(segue.sourceViewController.isKindOfClass(ConViewController)) {
        let viewCon:ConViewController = (segue.sourceViewController as? ConViewController)!
        lblOneData[tblIndex] = viewCon.pOneTextfield.text!
        lblTwoData[tblIndex] = viewCon.pTwoTextfield.text!
        lblThreeData[tblIndex] = viewCon.pThreeTextfield.text!
        lblFourData[tblIndex] = viewCon.pFourTextfield.text!
        tableView.reloadData()
    }
}

var tableData: [String] = ["8:00 am", "8:10 am", "8:20 am", "8:30 am", "8:40 am", "8:50 am", "9:00 am", "9:10 am", "9:20 am", "9:30 am", "9:40 am", "9:50 am", "10:00 am", "10:10 am", "10:20 am", "10:30 am", "10:40 am", "10:50 am", "11:00 am", "11:10 am", "11:20 am", "11:30 am", "11:40 am", "11:50 am", "12:00 pm", "12:10 pm", "12:20 pm", "12:30 pm", "12:40 pm", "12:50 pm", "1:00 pm", "1:10 pm", "1:20 pm", "1:30 pm", "1:40 pm", "1:50 pm", "2:00 pm", "2:10 pm", "2:20 pm", "2:30 pm", "2:40 pm", "2:50 pm", "3:00 pm", "3:10 pm", "3:20 pm", "3:30 pm", "3:40 pm", "3:50 pm", "4:00 pm", "4:10 pm", "4:20 pm", "4:30 pm", "4:40 pm", "4:50 pm", "5:00 pm"]
var courseData = ["Norman Course", "Riding Golf", "Dmob Course", "Brambleton", "Leesburg Clubhouse"]
var playersData = ["View All", "1 Available", "2 Available", "3 Available", "4 Available"]
var timeData = ["All Day", "Morning", "Afternoon"]
var lblOneData = ["Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available"]
var lblTwoData = ["Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available"]
var lblThreeData = ["Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available"]
var lblFourData = ["Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available","Available", "Available","Available","Available"]

let conSegueIdentifier = "ShowConSegue"
var timeToPass:String!
var availableIndexes = [Int]()
var tblIndex:Int!
var datePicker = UIDatePicker()

override func viewDidLoad() {
    super.viewDidLoad()

    let nib = UINib(nibName: "vwTblCell", bundle: nil)
    tableView.registerNib(nib, forCellReuseIdentifier: "cell")

    coursePicker.hidden = true
    self.courseTextfield.delegate = self

    playerPicker.hidden = true;
    self.playerTextfield.delegate = self

    timePicker.hidden = true;
    self.timeTextfield.delegate = self

    setupDatePicker()
}

func setupDatePicker() {
    dateTextfield.text = "Date"
    dateTextfield.textAlignment = .Center
    dateTextfield.tintColor = UIColor.clearColor()
    datePicker.datePickerMode = .Date

    let toolBar = UIToolbar()
    toolBar.barStyle = .Default
    toolBar.translucent = true
    toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    toolBar.sizeToFit()

    let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "doneClick")
    let spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: "cancelClick")
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.userInteractionEnabled = true

    // Adds the toolbar to the view
    dateTextfield.inputView = datePicker
    dateTextfield.inputAccessoryView = toolBar
}
func doneClick() {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = .ShortStyle
    dateTextfield.text = dateFormatter.stringFromDate(datePicker.date)
    dateTextfield.resignFirstResponder()
}
func cancelClick() {
    dateTextfield.resignFirstResponder()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//tableview

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var numRows = tableData.count
    if(timeTextfield.text == timeData[1]) {
        numRows = 25
    }
    else if(timeTextfield.text == timeData[2]) {
        numRows = 30
    }
    return numRows
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TblCell
    var lblOneBool = true
    var lblTwoBool = true
    var lblThreeBool = true
    var lblFourBool = true

    if(timeTextfield.text == timeData[2]) {
        cell.hidden = false
        cell.lblTime.text = tableData[indexPath.row + 25]
        cell.lblOne.text = lblOneData[indexPath.row + 25]
        cell.lblTwo.text = lblTwoData[indexPath.row + 25]
        cell.lblThree.text = lblThreeData[indexPath.row + 25]
        cell.lblFour.text = lblFourData[indexPath.row + 25]

                }
    else {
        cell.lblTime.text = tableData[indexPath.row]
        cell.lblOne.text = lblOneData[indexPath.row]
        cell.lblTwo.text = lblTwoData[indexPath.row]
        cell.lblThree.text = lblThreeData[indexPath.row]
        cell.lblFour.text = lblFourData[indexPath.row]
    }

    if(cell.lblOne.text != "Available") {
        lblOneBool = false
    }
    if(cell.lblTwo.text != "Available") {
        lblTwoBool = false
    }
    if(cell.lblThree.text != "Available") {
        lblThreeBool = false
    }
    if(cell.lblFour.text != "Available") {
        lblFourBool = false
    }

    if(playerTextfield.text == playersData[1]) {
        if(lblOneBool || lblTwoBool || lblThreeBool || lblFourBool) {
            cell.hidden = false
        }
        else {
            cell.hidden = true
        }
    }
    else if(playerTextfield.text == playersData[2]) {
        if((lblOneBool && lblTwoBool) || (lblOneBool && lblThreeBool) || (lblOneBool && lblFourBool) || (lblTwoBool && lblThreeBool) || (lblTwoBool && lblFourBool) || (lblThreeBool && lblFourBool)) {
            cell.hidden = false
        }
        else {
            cell.hidden = true
        }
    }
    else if(playerTextfield.text == playersData[3]) {
        if((lblOneBool && lblTwoBool && lblThreeBool) || (lblOneBool && lblTwoBool && lblFourBool) || (lblOneBool && lblThreeBool && lblFourBool) || (lblTwoBool && lblThreeBool && lblFourBool)) {
            cell.hidden = false
        }
        else {
            cell.hidden = true
        }
    }
    else if(playerTextfield.text == playersData[4]) {
        if(lblOneBool && lblTwoBool && lblThreeBool && lblFourBool) {
            cell.hidden = false
        }
        else {
            cell.hidden = true
        }
    }


    return cell
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 120
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let row = indexPath.row

    performSegueWithIdentifier(conSegueIdentifier, sender: indexPath)
    print(tableData[row])
    if(timeTextfield.text == timeData[2]) {
        tblIndex = row + 25
    }
    else {
        tblIndex = row
    }
}

//end of tableview

//pickerViews

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if(pickerView == coursePicker) {
        return courseData.count
    }
    else if(pickerView == playerPicker) {
        return playersData.count
    }
    else if(pickerView == timePicker) {
        return timeData.count
    }
    return 0
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if(pickerView == coursePicker) {
        return courseData[row]
    }
    else if(pickerView == playerPicker) {
        return playersData[row]
    }
    else if(pickerView == timePicker) {
        return timeData[row]
    }
    return courseData[row]
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if(pickerView == coursePicker) {
        courseTextfield.text = courseData[row]
        coursePicker.hidden = true
    }
    else if(pickerView == playerPicker) {
        playerTextfield.text = playersData[row]
        playerPicker.hidden = true
        tableView.reloadData()
    }
    else if(pickerView == timePicker) {
        timeTextfield.text = timeData[row]
        timePicker.hidden = true
        tableView.reloadData()
    }
}

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    if(textField == courseTextfield) {
        coursePicker.hidden = false
    }
    if(textField == playerTextfield) {
        playerPicker.hidden = false
    }
    else if(textField == timeTextfield) {
        timePicker.hidden = false
    }
    return false
}

//end of pickerViews

//segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == conSegueIdentifier {
        let cvc = segue.destinationViewController as! ConViewController;
        let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow!
        let valueToPass:String

        if(timeTextfield.text == timeData[2]){
            tblIndex = indexPath.row + 25
            valueToPass = tableData[indexPath.row + 25]
        }
        else {
            tblIndex = indexPath.row
            valueToPass = tableData[indexPath.row]
        }
        cvc.conName = courseTextfield.text
        cvc.conDateName = dateTextfield.text
        cvc.conTimeName = valueToPass
        cvc.indexOfTbl = tblIndex
    }
}

}

SwaggyMcMuffins
  • 27
  • 1
  • 1
  • 9
  • I only see where you add the datePicker to one view so when ever you click only that view should it show up. Are you trying to use the same textfield in multiple cells? – Tyrelidrel Nov 16 '15 at 22:06
  • I do not see where dateTextfield comes from, where is this decollated and how is it assigned – Knight0fDragon Nov 16 '15 at 22:54
  • The textfield is above the table view and is singular. The textfield is towards the top of the screen and when clicked, the datePicker should appear – SwaggyMcMuffins Nov 17 '15 at 13:29

1 Answers1

1

I just copy/pasted the same code you wrote in blank project and it works fine. So I guess the main problem is out of our view, maybe when you’re using UITableView. Can you show us the rest of code of this View Controller, especially that part when you dequeue table view cells and initializing dateTextfield?

P.S. I also highly recommend you not to create new instance of NSDateFormatter every time you need it, because it’s not very time-efficient. The most popular (and recommended by Apple developers) practice is to cache NSDateFormatters using singletons and lazy initializers. StackOverflow has one really good topic for it.

Community
  • 1
  • 1
  • I updated the code to include my whole class. I will also make sure to change the NSDateFormat as well after I get this working! – SwaggyMcMuffins Nov 18 '15 at 15:07
  • Also, the dateTextfield is above the table view and does not change or affect the tableview or cells in any manner. However, the picker should cover part of the table when it comes up from the bottom and go away once the user hits done or cancel. – SwaggyMcMuffins Nov 18 '15 at 15:10