Popular View with JSON

Asked

Viewed 147 times

2

I use a library called Alamofire-Swiftyjson to make a request JSON.

Call example:

Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
         .responseSwiftyJSON({ (request, response, json, error) in
                     println(json)
                     println(error)
 })

This url is just an example, my return JSON That’s the way it is:

Example of JSON return:

{
   "titulo1": "Silvio Santos Ipsum",
   "texto1": "Ma vai pra lá. Ma vai pra lá. Ma você, topa ou não topamm. O prêmio é em barras de ouro, que vale mais que dinheiroam. Ma vejam só, vejam só. Mah você não consegue né Moisés?",
   "url1": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url2": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url3": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "titulo2": "Patríciaaammmm... Luiz Ricardouaaammmmmm.",
   "texto2": "É namoro ou amizadeemm? Ma vale dérreaisam? Você veio da caravana de ondeammm? Ma não existem mulher feiam, existem mulher que não conhece os produtos Jequitiamm. Um, dois três, quatro, PIM, entendeuam? Patríciaaammmm... Luiz Ricardouaaammmmmm. O Raul Gil é gayam! ... Maa O Ah Ae! Ih Ih! O Raul Gil é gayamm! Mah é a porta da esperançaam."
}

I’ll always follow the pattern:

  • title + number
  • text + number

And sometimes :

  • url + number.

How can I popular my view with this information?

  • Will this JSON have only one field? Or N fields? In general I would suggest you assemble a solution using uitableview and custom cells. At the moment not put a complete answer because I am without time to give all the necessary details.

  • @Otávio will have n fields why it will be a normal text page, with a title field that will have a bold font with larger font is a text field with reduced font and no bold and images

  • But my question was more in the sense: Will this structure Titles + Images be repeated? For example [ silvioSantos, ratinho, xuxa, faustoSilva] ? Where each celebrity would have their own titles and images?

  • @Octavian titles and texts will now repeat images will not be on all screens.

2 answers

2


I agree with @Jefersonassis' reply that you should return a Json in array format.

I also agree with @Otávio’s comment, you should use a Uitableview and a Customcell.

But if you’d rather use that approach of yours, you’d have to create something like this:

var i = 1
while true {
    i = i + 1
    if let titulo = json["titulo" + i] {
           //cria uma view dinamicamente
           var view=UIView(frame: CGRectMake(100, 200 * i, 100, 100))

           //cria os labels dinamicamente e adiciona na view
           var label = UILabel(frame: CGRectMake(0, 10, 200, 21))
           label.center = CGPointMake(160, 284)
           label.textAlignment = NSTextAlignment.Center
           label.text = titulo
           view.addSubview(label) 

           //se tem título é certo que tem texto?
           if let texto = json["texto" + i] {
               var label = UILabel(frame: CGRectMake(0, 20, 200, 21))
               label.center = CGPointMake(160, 284)
               label.textAlignment = NSTextAlignment.Center
               label.text = texto
               view.addSubview(label) 
           }
           //e assim por diante com os outros dados do array
           //adiciona a view criada na Subview principal, ou em uma view com IBOutlet que você tenha criado pelo MainStoryBoard
           self.view.addSubview(view)
   }
   else {
      //se não tem a propriedade com o número de "i", então deve sair do loop
      break
   }

}
  • I followed the approach of creating a tableview for field completion, http://answall.com/questions/101915/como-customizar-uitableview

1

First you need to fix your return, today it is returning an object and instead of a array containing several objects

Instead of this return:

{
   "titulo1": "Silvio Santos Ipsum",
   "texto1": "Ma vai pra lá. Ma vai pra lá. Ma você, topa ou não topamm. O prêmio é em barras de ouro, que vale mais que dinheiroam. Ma vejam só, vejam só. Mah você não consegue né Moisés?",
   "url1": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url2": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url3": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "titulo2": "Patríciaaammmm... Luiz Ricardouaaammmmmm.",
   "texto2": "É namoro ou amizadeemm? Ma vale dérreaisam? Você veio da caravana de ondeammm? Ma não existem mulher feiam, existem mulher que não conhece os produtos Jequitiamm. Um, dois três, quatro, PIM, entendeuam? Patríciaaammmm... Luiz Ricardouaaammmmmm. O Raul Gil é gayam! ... Maa O Ah Ae! Ih Ih! O Raul Gil é gayamm! Mah é a porta da esperançaam."
}

Switch to something like that:

[{
   "titulo": "Silvio Santos Ipsum",
   "texto": "Ma vai pra lá. Ma vai pra lá. Ma você, topa ou não topamm. O prêmio é em barras de ouro, que vale mais que dinheiroam. Ma vejam só, vejam só. Mah você não consegue né Moisés?",
   "url1": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url2": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg",
   "url3": "http://lorempixel.com/image_output/abstract-q-g-263-221-3.jpg"
},
{
   "titulo": "Patríciaaammmm... Luiz Ricardouaaammmmmm.",
   "texto": "É namoro ou amizadeemm? Ma vale dérreaisam? Você veio da caravana de ondeammm? Ma não existem mulher feiam, existem mulher que não conhece os produtos Jequitiamm. Um, dois três, quatro, PIM, entendeuam? Patríciaaammmm... Luiz Ricardouaaammmmmm. O Raul Gil é gayam! ... Maa O Ah Ae! Ih Ih! O Raul Gil é gayamm! Mah é a porta da esperançaam."
}]

To popular his view, if using IBOutlet just called that way:

if let JSON = response.result.value {
    labelTitulo?.text = JSON[0]!["titulo"]
}

In the above example I always put picking up index 0 of array, but you can make the looping and suit your need

  • Jeferson, the return should be that, as it is already used in an Android application. it returns a valid JSON. will only change the manipulation of it. and in your JSON[0]! ["titulo1"] should only be JSON[0]! ["title"] if applicable. and I didn’t create any Iboutlet, I was thinking of putting everything programmatically because I don’t know the size that the texts could come...

  • +1 This is a weak area here, your help is very welcome.

  • I get it, but I advise you to change both, you have no reference to how many objects he returned. I always use with auto layout, the label resizes alone regardless of the size of the text that comes (I fixed the title1 in the answer, thanks :) )

Browser other questions tagged

You are not signed in. Login or sign up in order to post.