Ahmad Naser Turnkey Ecosystem Ahmad Naser
February 16, 2017

Eureka swift3 Dynamic form builder example part2

Published in the Ahmad Naser ecosystem. Estimated reading time: 4 minutes.

//
//  OrdersStepOneVC.swift
//  iOSMindizorApp
//
//  Created by AHMAD NASER on 2/10/17.
//  Copyright © 2017 Ahmad Naser Turnkey Solutions LLC. All rights reserved.
//

import UIKit
import Eureka
import Alamofire
import SwiftSpinner

class OrdersStepOneVC: FormViewController {
    let screenHeight = UIScreen.main.bounds.height
    let screenWidth = UIScreen.main.bounds.width
    // Colors
    let lightGray = UIColor(red: 239/255, green: 239/255, blue: 244/255, alpha: 1)
    let darkGray = UIColor(red: 146/255, green: 146/255, blue: 146/255, alpha: 1)
    let blue = UIColor(red: 0, green: 122/255, blue:1, alpha:1)
    let green = UIColor(red: 0, green: 155/255, blue: 0, alpha: 1)
    let white = UIColor.white
    let black = UIColor.black
    let benuGreen = UIColor(red: 88/255, green: 166/255, blue: 24/255, alpha: 1)

    let skyBlue = UIColor(red: 162/255, green: 222/255, blue: 248/255, alpha: 1)
    let appTintColor =  UIColor(red: 88/255, green: 166/255, blue: 24/255, alpha: 1)
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Section(){ section in
            section.header = {
                var header = HeaderFooterView<UIView>(.callback({
                    let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
                    view.backgroundColor = .red
                    return view
                }))
                header.height = { 100 }
                return header
            }()
        }
        
        form +++ Section("Section1")
            <<< TextRow(){ row in
                row.title = "Text Row"
                row.placeholder = "Enter text here"
            }
            
            
            <<< SegmentedRow<String>("gender"){
                $0.options = ["male", "female"]
                $0.title = "m"
                $0.value = "f"
                }.onChange{ row in
              print(row.value)
            }
            
        
            <<< PhoneRow(){
                $0.title = "Phone Row"
                $0.placeholder = "And numbers here"
            }
            +++ Section("Section2")
            <<< DateRow(){
                $0.title = "Date Row"
                $0.value = NSDate(timeIntervalSinceReferenceDate: 0) as Date
            }
           <<< SwitchRow("switchRowTag"){
                        $0.title = "Show message"
                        }
           <<< LabelRow(){
               $0.hidden = Condition.function(["switchRowTag"], { form in
                                return !((form.rowBy(tag: "switchRowTag") as? SwitchRow)?.value ?? false)
                            })
                            $0.title = "Switch is on!"
            
            
            form +++ Section("Multiple Choices")
                <<< MultipleSelectorRow<String>() {
                    $0.title = "Favourite Foods"
                    $0.options = ["🍝", "🍟", "🍕", "🍚"]
                    $0.value = ["🍝", "🍕" ]
            }
            
            
            form +++ Section("اختر لغات البطاقات")
                <<< MultipleSelectorRow<String>("languages") {
                    $0.title = "Choosed langs"
                    $0.options = ["العربية","الفرنسية", "الألمانية",
                                  "الروسية","البرتغالية", "الأندونسية",
                                  "اليابانية","الفلبينية", "الانجليزية",]
                    $0.value = ["العربية", "الانجليزية" ]
                    }.onPresent { from, to in
                        

                    }.onChange {_ in 
                        let values = self.form.values() as? [String : Any?]
                        var languages = self.getSelectedLanguages(languages: values?["languages"] as! Set<String>)
                        
                        print(languages[0])
                        print(languages.count)
                        
                        
            }
            
      
            form +++ Section("Login Form")
                <<< TextRow() { $0.placeholder = "Username" }
                <<< PasswordRow() { $0.placeholder = "Password" }
                <<< ButtonRow() {
                    $0.title = "Login"
                    $0.onCellSelection { cell, row in
               //   self.presentAlert(message: "Will login")
                        }
                        
                        
                    
                  
     
            
            }
 
        }
        
        
        
        
        
        
   
        addFormWithToggle(toForm: form)
        
       let continents = ["Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America"]
        form +++ SelectableSection<ListCheckRow<String>>("Where do you live", selectionType: .multipleSelection)
        
     
        for option in continents {
            form.last! <<< ListCheckRow<String>(option){ listRow in
                listRow.title = option
                listRow.selectableValue = option
                listRow.value = nil
                
            }
        }
        
        

         self.AddLanguagesTexts(toForm: self.form)
        
         self.AddBottomPart(toForm: self.form)
        
        
    }
    
    
    private func AddBottomPart(toForm form: Form) {
        // Error and Buttons section
        form   +++ Section() { section in
            section.tag = "error"
            var header = HeaderFooterView<UIView>(.class)
            header.height =  { 50 }
            
            let label = UILabel(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 50))
            label.textColor = UIColor.red
            label.textAlignment = .center
            
            header.onSetupView = { view, section in
                label.removeFromSuperview()
                //  view.addSubview(label)
                label.text = "error"
                //    label.isHidden = !self.showError
            }
            section.header = header
            }
            
            <<< ButtonRow() {
                $0.title = "#next"
                }.cellSetup() {cell, row in
                    cell.backgroundColor = self.appTintColor
                    cell.tintColor = UIColor.white
                    let bgColorView = UIView()
                    bgColorView.backgroundColor = self.appTintColor
                    cell.selectedBackgroundView = bgColorView
                }.onCellSelection {  cell, row in
                    //  self.nextButtonTapped()
        }
        
        

    }
    
    
    
    
      private func AddLanguagesTexts(toForm form: Form) {

        
    let itemNames = ["one","two","three"]
       var i = 1
        
        
         let values = form.values()
        
        if let v = values["item1"] {


            /*
            for itemName in itemNames{
               
             var r =   form.rowBy(tag: "item \(i)")
                r?.title = "changed"
                i = i + 1

            }
            */

        }else {
            
            
            
            
            
            
            // Eureka From Set-up
            form
                +++ Section("vvvv")
           i = 1
            for itemName in itemNames{
                
                form.last!
                    <<< TextRow("item \(i)") {
                        $0.title = itemName
                        $0.placeholder = itemName
                        //$0.hidden = true
                        i = i + 1
                }
            }
        
        }
        
        
        
        
        // Eureka From Set-up
        /*
        form
            +++ Section("Select item values")
        
        for itemName in itemNames{
            
            form.last!
                
                <<< StepperRow() {
                    $0.tag = itemName
                    $0.title = itemName
                    $0.value = 0
            }
        }
        */
        
    }
    private func addFormWithToggle(toForm form: Form) {
        let switchRowTag = "switch_row"
        let setStartDateRowTag = "set_start_date_time"
        let setEndDateRowTag = "set_end_date_time"
        
        let switchRow = SwitchRow(switchRowTag) {
            $0.title = "All Day Event"
            $0.value = true
        }

        let hiddenCondition = Condition.function([switchRowTag]) { form in
            guard let switchCell = form.rowBy(tag:switchRowTag) as? SwitchRow else {
                return false
            }
            
            return switchCell.value == true
        }
        
        let s = Section()
        s.append(switchRow)
        s.append(DateTimeInlineRow(setStartDateRowTag) {
            $0.title = "Starts"
            $0.value =  NSDate.oneHourFromNow() as Date
            $0.hidden = hiddenCondition
        })
        s.append(DateTimeInlineRow(setEndDateRowTag) {
            $0.title = "Ends"
            $0.value =  NSDate.hoursFormNow(numberOfHours: 4) as Date
            $0.hidden = hiddenCondition
        })
        form.append(s)
    }
    private func presentAlert(title: String? = nil, message: String) {
        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alertController, animated: true, completion: nil)
    }
    
    
    
     func getSelectedLanguages(languages: Set<String>) -> [String] {
        var result = [String]()
        for lang in languages {
result.append(lang)
        }
        return result
    }
}



extension NSDate {
    
    static func oneHourFromNow() -> NSDate {
        return NSDate.hoursFormNow(numberOfHours: 1)
    }
    
    static func hoursFormNow(numberOfHours: Int) -> NSDate {
        let interval = Double(numberOfHours) * 60
        return NSDate().addingTimeInterval(interval)
    }
    
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *