0

I try to refer to new added textFields. The point is to put in these textfields data and then save it in CoreData but I have not any idea how to do it.

Below print- screen

By the help of Add button I can add new row of textfields

Model of Textfields is in another class "txtfields", not in ViewController. In textfields class all textfields are placed in the function.

class txtFields: UIView {




func inputTxtFields( value: Int,value2: Int, value3:Int, ScrollView: UIView) {



    var tf = UITextField(frame: CGRect(x: 20, y: value, width: 100, height: 30))
    tf.backgroundColor = .white
    tf.placeholder = "excercise"
    tf.layer.cornerRadius = 5
    ScrollView.addSubview(tf)




    var tf2 = UITextField(frame: CGRect(x: 150, y: value2, width: 30, height: 30))
    tf2.backgroundColor = .white
    tf2.layer.cornerRadius = 5
    tf2.placeholder = "rp"
    ScrollView.addSubview(tf2)



    let tf3 = UITextField(frame: CGRect(x: 150, y: value3, width: 30, height: 30))
    tf3.backgroundColor = .white
    tf3.layer.cornerRadius = 5
    tf3.placeholder = "kg"
    ScrollView.addSubview(tf3)



    let tf4 = UITextField(frame: CGRect(x: 200, y: value2, width: 30, height: 30))
    tf4.backgroundColor = .white
    tf4.layer.cornerRadius = 5
    tf4.placeholder = "rp"
    ScrollView.addSubview(tf4)


    let tf5 = UITextField(frame: CGRect(x: 200, y: value3, width: 30, height: 30))
    tf5.backgroundColor = .white
    tf5.layer.cornerRadius = 5
    tf5.placeholder = "kg"
    ScrollView.addSubview(tf5)


    let tf6 = UITextField(frame: CGRect(x: 250, y: value2, width: 30, height: 30))
    tf6.backgroundColor = .white
    tf6.layer.cornerRadius = 5
    tf6.placeholder = "rp"
    ScrollView.addSubview(tf6)

    let tf7 = UITextField(frame: CGRect(x: 250, y: value3, width: 30, height: 30))
    tf7.backgroundColor = .white
    tf7.layer.cornerRadius = 5
    tf7.placeholder = "kg"
    ScrollView.addSubview(tf7)


    let tf8 = UITextField(frame: CGRect(x: 300, y: value2, width: 30, height: 30))
    tf8.backgroundColor = .white
    tf8.layer.cornerRadius = 5
    tf8.placeholder = "rp"
    ScrollView.addSubview(tf8)

    let tf9 = UITextField(frame: CGRect(x: 300, y: value3, width: 30, height: 30))
    tf9.backgroundColor = .white
    tf9.layer.cornerRadius = 5
    tf9.placeholder = "kg"
    ScrollView.addSubview(tf9)

    let tf10 = UITextField(frame: CGRect(x: 350, y: value2, width: 30, height: 30))
    tf10.backgroundColor = .white
    tf10.layer.cornerRadius = 5
    tf10.placeholder = "rp"
    ScrollView.addSubview(tf10)

    let tf11 = UITextField(frame: CGRect(x: 350, y: value3, width: 30, height: 30))
    tf11.backgroundColor = .white
    tf11.layer.cornerRadius = 5
    tf11.placeholder = "kg"
    ScrollView.addSubview(tf11)

}

In ViewController(vc3) I create textfields object : let Fields = textfields().

In IBoutlet func add, function from the textfields class will start and every press on add button will create a new row.

class vc3: UIViewController {

var train = [Training]()
let access = Data()
var name:String?
var buttonPressed = 0
var  wartoscy = 250
var wartosc2 = 265
var wartosc3 = 230
var addClicked = 0
var indexPath = 0
let Fields = txtFields()
var quantity = 0


@IBAction func add(_ sender: UIButton) {
    print("clicked")

    if self.quantity < 10 {
        Fields.inputTxtFields( value: wartoscy, value2: wartosc2, value3: wartosc3, ScrollView: scview)

    } else {

        Alert.showAlert(vc: self)

        return
        }

    buttonPressed += 1
    quantity += 1
    addClicked += 1
    btnSave.isHidden = false
    btnconstraints.constant += 100
    wartoscy += 80
    wartosc2 += 80
    wartosc3 += 80

 }

As you can see right now I have names of these textFields like tf1 ... tf2.. and so on but I don't know how to refer to them to create a Core data attributes. Maybe I should to create them without function? But I need to have value(wartosc) which is used to move textfields in the lower position. Variable wartosc is placed in vc3.I want of course to have all of these textfields in another class like now.

When I was working with Storyboard only the solution was simple: IBoutlet, but now I don't know how to find a solution.

kuba
  • 3
  • 4

1 Answers1

0

You need to reference them like this

class txtFields: UIView {
   var tf:UITextField!
   func inputTxtFields( value: Int,value2: Int, value3:Int, ScrollView: UIView) {
      tf = UITextField(frame: CGRect(x: 20, y: value, width: 100, height: 30))
   }
}

//

let Fields = txtFields()
Fields.inputTxtFields( value: wartoscy, value2: wartosc2, value3: wartosc3, ScrollView: scview)
print(Fields.tf.text)

//

Also I recommend creating a function that returns a textfield instance instead of repeating the same code

//

According to your comment

class txtFields: UIView {
   var allTexFs = [UITextField]()
   func inputTxtFields( value: Int,value2: Int, value3:Int, ScrollView: UIView) {
     let tf = UITextField(frame: CGRect(x: 20, y: value, width: 100, height: 30))
     allTexFs.append(tf)
   }
}
Shehata Gamal
  • 98,760
  • 8
  • 65
  • 87
  • I thought about it but after each press of Add button I will create a new set of 11 textfields. In Your example I can create only these 11 textfields which will be copied and refer to them. SO I think that after creation new set it also must to create new stored property of class textfields. Something like that... I try to use logic. – kuba Jul 27 '18 at 12:50
  • This is what I thought about. When I create for example second row and I will have the same name for example [tf,tf1........tf.....tf] How to differentiate them? Maybe add something to the new name? For example . if Addbtn pressed 2 times var tf,tf1..... += "1" if you know what I mean. – kuba Jul 27 '18 at 13:07
  • index of array can easily be used to accomplish that , if you want to access the first 11 , then use indices from 0...10 – Shehata Gamal Jul 27 '18 at 13:11
  • That's right, I know that but when you take a look at my apps, there is possibility to take filled textfielddata without order and then when I will fetch them from CoreData I will have the problem with row so I was thinking about giving a special name to each. But I can also give maybe empty string when textfield will be empty and use your idea. – kuba Jul 27 '18 at 13:15
  • Can you give me one more advice? I want to put these Strings from Textfields into coreData and I am not sure wether I should to create 11x10 attributes in core Data ? Every attribute will collect data from textfields and when textfield is empty it will add to coredata empty String. Are there any better possibilities to do this? Notice that I have possibility to have 1set of rows of textfields and also ten sets of rows as a maximal. – kuba Jul 27 '18 at 13:21
  • anyway you can create a subclass of **UITextField** and add properties as you want and set them when creating , You need to create a table with 11 attributes , create object for every block and add it – Shehata Gamal Jul 27 '18 at 13:24