0

enter image description hereenter image description hereenter image description hereenter image description hereI am trying to create a dictionary type app with section header, title text, and subtitle text. I managed to get everything to work using the following code. The only thing I can't figure out is how to filter the UISearchBar to show the results of the String [Coptic] within the array. Is this even possible the way I organized everything or do I need to restructure? Does anyone have any suggestions?

I left the code for the updateSearchResults blank on the bottom because I don't know what to code.

 class Gamma: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating {


    struct words {

        var sectionName : String!
        var coptic : [String]!
        var english : [String]!
    }

    var array = [words]()
    var filtered = [words]()
    var filtered2 = UITableViewController()

    var indexarray = ["Ga", "Ge", "Gy", "Gn", "Go", "Gr", "Gw"]

    let searchController = UISearchController(searchResultsController: nil)




    override func viewDidLoad() {
        super.viewDidLoad()


        let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont(name:"CS Avva Shenouda", size:17), NSAttributedStringKey.foregroundColor.rawValue:UIColor.black]


        UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttribs as Any as! [String : Any]


        self.navigationController?.navigationBar.tintColor = UIColor.white

        filtered = array

        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false


        self.navigationItem.titleView = searchController.searchBar

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 400
        tableView.sectionHeaderHeight = 40
        tableView.sectionIndexBackgroundColor = UIColor.clear
        tableView.sectionIndexMinimumDisplayRowCount = 15


        array = [words(sectionName: "Ga", coptic: ["Gabriyl", "gaza", "gazovulakion", "gala", "galynyc", "Galile`a", "galileoc", "gamoc", "gar"], english: ["ghabriyēl\n\n(Heb.) - Gabriel", "ghå`zå\n\n(f.) - Treasure, money chest", "ghåzo`filåk`yon\n\n(Gk.) - Treasury", "ghå`lå\n\n(Gk. m.) - Milk", "ghålēnēs\n\n(Gk. f.) - Gentle, calm", "ghålilā`å\n\nGalilee", "ghålilā`os\n\n(adj.) - Galilean", "ghåmos / gåmos\n\n(Gk. m.) - Wedding, marriage", "ghår\n\n(Gk. conj.) - For, because"]),
        words(sectionName: "Ge", coptic: ["geenna", "gene`a", "genecic", "genneoc", "gennyma", "gennycic", "gennytyc", "gennytria", "genoc", "Gewrgioc"], english: ["ge`ā`nå\n\n(Heb.) - Gehenna, Hades", "gene`å\n\n1. (Gk. f.) - Generation\n\n2. (Gk. f.) - New, recent", "genesis\n\n(Gk. f.) - Birth, start, inception", "gennā`os\n\n(Gk. adj.) - Brave, noble, honorable, good", "gennē`må\n\n(Gk. m.) - Offspring, product", "gennē`sis\n\n(Gk. f.) - Birth, generation", "gennē`tēs\n\n(Gk. m.) - Parent, generator", "gennēt`riyā\n\n(Gk. f.) - Parent, generator", "gā`nos\n\n(Gk. m.) - Race, tribe", "ge`ōrgi`yos\n\nGeorge"]),
                 words(sectionName: "Gy", coptic: ["gy"], english: ["gē\n\n(Gk. f.) - Earth, ground, land"]),
                 words(sectionName: "Gn", coptic: ["gnovoc", "gnwmy", "gnwcic"], english: ["ghno`fos\n\n(Gk. m.) - Darkness, gloom", "ghnō`mē\n\n(Gk. f.) - Opinion, thought, judgement", "ghnō`sis\n\n(Gk. f.) - Knowledge"]),
                 words(sectionName: "Go", coptic: ["Golgo;a", "Gomorra", "gonato"], english: ["gholghothå\n\n(Heb. f.) - Calvary, Golgotha", "ghomorrå\n\n(Heb.) - Gomorrah", "ghonå`to\n\n(Gk.) - Knee"]),
                 words(sectionName: "Gr", coptic: ["grammateuc", "grammatiky", "gravy"], english: ["gråmmå`tevs\n\n(Gk. m.) - Scribe, secretary", "gråmmå`tikē\n\n(Gk. f.) - Grammar", "ghrå`fē\n\n(Gk. f.) - Writing, drawing, book"]),
                 words(sectionName: "Gw", coptic: ["Gwg"], english: ["gōg\n\nGog"]),

        ]


    }

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

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell!

        cell?.textLabel?.text = array[indexPath.section].coptic[indexPath.row]
        cell?.detailTextLabel?.text = array[indexPath.section].english[indexPath.row]
        cell?.textLabel?.font = UIFont(name:"CS Avva Shenouda", size:30)
        cell?.detailTextLabel?.font = UIFont(name: "Constantia", size:25)
        cell?.textLabel?.numberOfLines = 0
        cell?.detailTextLabel?.numberOfLines = 0
        cell?.textLabel?.textColor = UIColor.black
        cell?.detailTextLabel?.textColor = UIColor.darkGray

        return cell!
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        return array.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return array[section].coptic.count

    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return array[section].sectionName

    }

    override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return indexarray
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
    {
        let header = view as! UITableViewHeaderFooterView
        header.textLabel?.font = UIFont(name: "CS Avva Shenouda", size: 25)!
        header.textLabel?.textColor = UIColor.black
        header.backgroundView?.backgroundColor = UIColor.lightGray

    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Row \(indexPath.row) selected")
    }

    func updateSearchResults(for searchController: UISearchController) {
        if searchController.searchBar.text! == "" {


        } else {


        }

    }


}
3
  • 1
    what exactly you want post screenshot of filtered result. (as you declared filtered array but not used in tableview) Commented Oct 28, 2017 at 4:22
  • 1
    suppose i type "gal" what is the output Commented Oct 28, 2017 at 4:23
  • 1
    okey even though i added solution hope it works for you.. Commented Oct 28, 2017 at 4:27

1 Answer 1

1

I try to figure out your problem hope you want the following code to get output

enter image description here

//
//  ViewController.swift
//  Testing
//
//  Created by Jaydeep on 28/10/17.


    import UIKit

    class Gamma: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating,UISearchControllerDelegate {


        struct words {

            var coptic : [String]!
            var english : [String]!
        }

        var array = [words]()
        var filtered = [words]()
        var filtered2 = UITableViewController()



        let searchController = UISearchController(searchResultsController: nil)




        override func viewDidLoad() {
            super.viewDidLoad()


            let defaultTextAttribs = [NSAttributedStringKey.font.rawValue: UIFont.systemFont(ofSize: 17), NSAttributedStringKey.foregroundColor.rawValue:UIColor.black]


            UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = defaultTextAttribs as Any as! [String : Any]


            self.navigationController?.navigationBar.tintColor = UIColor.white


            searchController.searchBar.delegate = self
            searchController.searchResultsUpdater = self
            searchController.hidesNavigationBarDuringPresentation = false
            searchController.dimsBackgroundDuringPresentation = false
            searchController.delegate = self

            self.navigationItem.titleView = searchController.searchBar

            tableView.rowHeight = UITableViewAutomaticDimension
            tableView.estimatedRowHeight = 400
            tableView.sectionHeaderHeight = 40
            tableView.sectionIndexBackgroundColor = UIColor.clear
            tableView.sectionIndexMinimumDisplayRowCount = 15


            array = [words(coptic: ["Gabriyl", "gaza", "gazovulakion", "gala", "galynyc", "Galile`a", "galileoc", "gamoc", "gar"], english:
                ["ghabriyēl \n\n(Heb.) - Gabriel", "ghå`zå\n\n(f.) - Treasure,money chest", "ghåzo`filåk`yon\n\n(Gk.) - Treasury", "ghå`lå\n\n(Gk. m.) - Milk", "ghålēnēs\n\n(Gk. f.) - Gentle, calm", "ghålilā`å\n\nGalilee", "ghålilā`os\n\n(adj.) - Galilean", "ghåmos / gåmos\n\n(Gk. m.) - Wedding, marriage", "ghår\n\n(Gk. conj.) - For, because"]),
                     words(coptic: ["geenna", "gene`a", "genecic", "genneoc", "gennyma", "gennycic", "gennytyc", "gennytria", "genoc", "Gewrgioc"], english: ["ge`ā`nå\n\n(Heb.) - Gehenna, Hades", "gene`å\n\n1. (Gk. f.) - Generation\n\n2. (Gk. f.) - New, recent", "genesis\n\n(Gk. f.) - Birth, start, inception", "gennā`os\n\n(Gk. adj.) - Brave, noble, honorable, good", "gennē`må\n\n(Gk. m.) - Offspring, product", "gennē`sis\n\n(Gk. f.) - Birth, generation", "gennē`tēs\n\n(Gk. m.) - Parent, generator", "gennēt`riyā\n\n(Gk. f.) - Parent, generator", "gā`nos\n\n(Gk. m.) - Race, tribe", "ge`ōrgi`yos\n\nGeorge"]),
                     words( coptic: ["gy"], english: ["gē\n\n(Gk. f.) - Earth, ground, land"]),
                     words(coptic: ["gnovoc", "gnwmy", "gnwcic"], english: ["ghno`fos\n\n(Gk. m.) - Darkness, gloom", "ghnō`mē\n\n(Gk. f.) - Opinion, thought, judgement", "ghnō`sis\n\n(Gk. f.) - Knowledge"]),
                     words(coptic: ["Golgo;a", "Gomorra", "gonato"], english: ["gholghothå\n\n(Heb. f.) - Calvary, Golgotha", "ghomorrå\n\n(Heb.) - Gomorrah", "ghonå`to\n\n(Gk.) - Knee"]),
                     words( coptic: ["grammateuc", "grammatiky", "gravy"], english: ["gråmmå`tevs\n\n(Gk. m.) - Scribe, secretary", "gråmmå`tikē\n\n(Gk. f.) - Grammar", "ghrå`fē\n\n(Gk. f.) - Writing, drawing, book"]),
                     words( coptic: ["Gwg"], english: ["gōg\n\nGog"]),

            ]
            filtered = array


        }
        func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
            searchBar.text = ""
            // Hide the cancel button
            searchBar.showsCancelButton = false
            filtered = array
            tableView.reloadData()
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }

        // MARK: - Table view data source
    override func numberOfSections(in tableView: UITableView) -> Int {
    if filtered.count > 0

    {
        return filtered.count
    }
    else
    {
        return 0
    }
}
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cellIdentifier = "cell"
            var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
            if cell == nil
            {
                cell = UITableViewCell(style: UITableViewCellStyle.value2, reuseIdentifier: cellIdentifier)
            }
            cell?.textLabel?.text = filtered[indexPath.section].coptic[indexPath.row]
            cell?.detailTextLabel?.text = filtered[indexPath.section].english[indexPath.row]
            cell?.textLabel?.font = UIFont.systemFont(ofSize: 20)
            cell?.detailTextLabel?.font = UIFont.systemFont(ofSize: 15)
            cell?.textLabel?.numberOfLines = 0
            cell?.detailTextLabel?.numberOfLines = 0
            cell?.textLabel?.textColor = UIColor.black
            cell?.detailTextLabel?.textColor = UIColor.darkGray

            return cell!
        }

        override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return UITableViewAutomaticDimension
        }


        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            if filtered.count > 0
            {
                return filtered[section].coptic.count
            }
            else
            {
            return 0
            }
        }

        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }

        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            print("Row \(indexPath.row) selected")
        }

        func updateSearchResults(for searchController: UISearchController) {
            // If we haven't typed anything into the search bar then do not filter the results
            if searchController.searchBar.text! == ""
            {
                filtered = array
            }
            else
            {
                filtered.removeAll()
                for  i:Int in 0 ..< array.count
                    {
                        var copticArray:[String] = []
                        var englishArray:[String] = []
                        var tempWord:words = words.init(coptic: [], english: [])


                        let copticCount = array[i].coptic.count
                        for  copticIndex:Int in 0 ..< copticCount
                        {
                            if array[i].coptic[copticIndex].lowercased().contains(searchController.searchBar.text!.lowercased())
                            {

                                copticArray.append(array[i].coptic[copticIndex])
                                englishArray.append(array[i].english[copticIndex])

                            }
                        }

                        tempWord.coptic = copticArray
                        tempWord.english = englishArray
                        if (copticArray.count > 0)
                        {
                            self.filtered.append(tempWord)
                        }
                    }
                tableView.reloadData()

            }
        }


    }
Sign up to request clarification or add additional context in comments.

24 Comments

I got it to work. Thank you so much. Do you by any chance know how to change the font of the index array?
Ok so this code actually works when the cell is set to custom. But when the cell is set to subtitle, which is the format I want, it crashes when I search for a word. Any reason as to why this happens?
To be more clear, I want to filter using the coptic string and have it show as the cell textlabel, while also showing the corresponding english string in the detailtextlabel. Is this at all possible?
you mean to say if i search "Gal" it only display the section "GA" not "GE" even there is string in "GE" section right??
I added a picture for reference. So imagine in section "Ga" there are ten words. The coptic and english string for the ten words are listed in alphabetical order. So when the table loads, it writes the Coptic string word on top and the english word underneath it in the cell. I want to be able to filter through the sections to look up a coptic word and have the corresponding english definition to be underneath it.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.