Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MPGTextField for TextViews? #26

Open
sadden3194 opened this issue Feb 1, 2016 · 0 comments
Open

MPGTextField for TextViews? #26

sadden3194 opened this issue Feb 1, 2016 · 0 comments

Comments

@sadden3194
Copy link

Hello together,

this is my code, which works fine for Textfields, but is there an solution for TextViews?

`import UIKit

@objc protocol ACTextFieldDelegate{
func dataForPopoverInTextField(textField: ACTextField) -> [Dictionary<String, AnyObject>]
optional func textFieldDidEndEditing(textField: ACTextField, withSelection data: Dictionary<String,AnyObject>)
optional func textFieldShouldSelect(textField: ACTextField) -> Bool
}

public class ACTextField: UITextView, UITextViewDelegate, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate {

var mDelegate : ACTextFieldDelegate?
var tableViewController : UITableViewController?
var data = [Dictionary<String, AnyObject>]()


@IBInspectable var popoverBackgroundColor : UIColor = UIColor(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 1.0)

@IBInspectable var popoverSize : CGRect?

@IBInspectable var seperatorColor : UIColor = UIColor(white: 0.95, alpha: 1.0)


/*override init(frame: CGRect) {
    super.init(frame: frame)
}*/

/*required public init?(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
}*/


override public func layoutSubviews(){

    super.layoutSubviews()
    let str : String = self.text!

    if (str.characters.count > 0) && (self.isFirstResponder()) {

        data = mDelegate!.dataForPopoverInTextField(self)
        self.provideSuggestions()

    } else{

        if let table = self.tableViewController{
            if table.tableView.superview != nil{
                table.tableView.removeFromSuperview()
                self.tableViewController = nil
            }
        }

    }
}

override public func resignFirstResponder() -> Bool{
    UIView.animateWithDuration(0.3, animations: ({ self.tableViewController!.tableView.alpha = 0.0 }), completion:{
            (finished : Bool) in
            self.tableViewController!.tableView.removeFromSuperview()
            self.tableViewController = nil
    })
    self.handleExit()
    return super.resignFirstResponder()
}

func provideSuggestions(){

    if self.applyFilterWithSearchQuery(self.text!).count > 0 {
        let tapRecognizer = UITapGestureRecognizer(target: self, action: "tapped:")
        tapRecognizer.numberOfTapsRequired = 1
        tapRecognizer.cancelsTouchesInView = false
        tapRecognizer.delegate = self
        self.superview!.addGestureRecognizer(tapRecognizer)

        self.tableViewController = UITableViewController()
        self.tableViewController!.tableView.delegate = self
        self.tableViewController!.tableView.dataSource = self
        self.tableViewController!.tableView.backgroundColor = self.popoverBackgroundColor
        self.tableViewController!.tableView.separatorColor = self.seperatorColor
        if let frameSize = self.popoverSize{
            self.tableViewController!.tableView.frame = frameSize
        }
        else{
            var frameForPresentation = self.frame
            frameForPresentation.origin.y += self.frame.size.height
            frameForPresentation.size.height = 150
            frameForPresentation.size.width = self.frame.size.width
            self.tableViewController!.tableView.frame = frameForPresentation
        }

        var frameForPresentation = self.frame
        frameForPresentation.origin.y += self.frame.size.height
        frameForPresentation.size.height = 150
        frameForPresentation.size.width = self.frame.size.width
        tableViewController!.tableView.frame = frameForPresentation

        //self.superview!.addSubview(tableViewController!.tableView)

        let aView = tableViewController!.tableView
        var frame = aView.frame

        frame.origin = self.superview!.convertPoint(frame.origin, toView: nil)
        aView.frame = frame

        self.window!.addSubview(aView)

        self.tableViewController!.tableView.alpha = 0.0
        UIView.animateWithDuration(0.3, animations: ({ self.tableViewController!.tableView.alpha = 1.0 }), completion:{
                (finished : Bool) in
        })
    }

}

func tapped (sender : UIGestureRecognizer!){
    if let table = self.tableViewController{
        if !CGRectContainsPoint(table.tableView.frame, sender.locationInView(self.superview)) && self.isFirstResponder(){
            self.resignFirstResponder()
        }
    }
}

public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    let count = self.applyFilterWithSearchQuery(self.text!).count
    if count == 0{
        UIView.animateWithDuration(0.3, animations: ({ self.tableViewController!.tableView.alpha = 0.0 }), completion:{
                (finished : Bool) in
                if let table = self.tableViewController{
                    table.tableView.removeFromSuperview()
                    self.tableViewController = nil
                }
        })
    }
    return count
}

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

    var cell = tableView.dequeueReusableCellWithIdentifier("MPGResultsCell") as UITableViewCell!

    if cell == nil {
        cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MPGResultsCell")
    }

    cell.backgroundColor = UIColor.clearColor()
    let dataForRowAtIndexPath = self.applyFilterWithSearchQuery(self.text!)[indexPath.row]
    let displayText : AnyObject? = dataForRowAtIndexPath["DisplayText"]
    cell.textLabel!.text = displayText as? String
    cell.detailTextLabel!.text = "SubbDetails"

    return cell
}

public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
    //self.text = self.applyFilterWithSearchQuery(self.text!)[indexPath.row]["DisplayText"]
    self.resignFirstResponder()
}


func applyFilterWithSearchQuery(filter : String) -> [Dictionary<String, AnyObject>]
{

    let filteredData = data.filter({
        if let match : AnyObject  = $0["DisplayText"]{
            return (match as! NSString).lowercaseString.hasPrefix((filter as NSString).lowercaseString)
        }
        else{
            return false
        }
    })
    return filteredData
}

func handleExit(){
    if let table = self.tableViewController{
        table.tableView.removeFromSuperview()
    }
    if ((mDelegate?.textFieldShouldSelect?(self)) != nil){
        if self.applyFilterWithSearchQuery(self.text!).count > 0 {

            let selectedData = self.applyFilterWithSearchQuery(self.text!)[0]
            let displayText : AnyObject? = selectedData["DisplayText"]
            self.text = displayText as? String
            mDelegate?.textFieldDidEndEditing?(self, withSelection: selectedData)
        }
        else{
            mDelegate?.textFieldDidEndEditing?(self, withSelection: ["DisplayText":self.text!, "CustomObject":"NEW"])
        }
    }

}

}
`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant