2016-01-11 2 views
1

Я разрабатываю приложение, где я программным образом создаю кнопки. Когда я нажимаю кнопку, он будет запрашивать данные из базы данных и показывать их в другом представлении.Загрузить данные в новом окне, когда кнопка нажата с быстрым

Я использую button.tag, чтобы определить, какие данные запрашивать, и я могу получить тег только после нажатия кнопки.

Однако, когда я нажимаю кнопку, в первый раз ничего не отображается. Я должен щелкнуть его снова, чтобы увидеть данные, которые я хочу.

override func viewDidLoad() { 
    super.viewDidLoad() 

    //parseJSON(tagId) 
    createButton() 

    // Do any additional setup after loading the view, typically from a nib. 
} 
func createButton(){ 

    var j:CGFloat=60 
    for var i:Int = 0 ; i < myImages.count;i = i+1 { 
     let myButton = UIButton() 
     myButton.setImage(UIImage(named: "carasusto.jpg"), forState: UIControlState.Normal) 
     myButton.setTitleColor(UIColor.blueColor(), forState: .Normal) 
     myButton.frame = CGRectMake(j, j+60, 50, 50) 

     myButton.tag = i //assign a tag to every button 
     myButton.addTarget(self, action: "segueToCreate:", forControlEvents: UIControlEvents.TouchUpInside) 
     self.view.addSubview(myButton) 

     j=j+60 
     print(myImages[i]) 

    } 
} 

и

@IBAction func segueToCreate(sender: UIButton){ 
    tagId = String(sender.tag)//tagId needs to fetch the information 
    parseJSON(tagId) 
    performSegueWithIdentifier("segueToView", sender:self) 
} 
func parseJSON(tagID:String){ 

    Alamofire.request(.GET, "http://smarttags-001-site1.btempurl.com/SmartTagsRequests.aspx", parameters: ["AjaxFunc":"GetTagAttr","TagID":"\(tagID)"]).validate().responseJSON{ response in 
     switch response.result{ 
     case .Success: 
      if let value = response.result.value { 

       let json = JSON(value) 

       print("JSON: \(json)") 
       self.TagName = json[0]["TagName"].stringValue 
       NSLog("\(self.TagName)") 
       self.ContentTitle = json[0]["ContentTitle"].stringValue 
       NSLog("\(self.ContentTitle)") 
      } 
     case .Failure(let error): 
      print(error) 
     }enter code here 
    } 
} 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    var ViewTest : ViewTwo = segue.destinationViewController as! ViewTwo 
    var TagNameLabel = UILabel() 
    TagNameLabel.frame = CGRectMake(74, 112, 182, 64) 
    ViewTest.view.addSubview(TagNameLabel) 
    TagNameLabel.text = TagName 
    var ContentTitleLabel = UILabel() 
    ContentTitleLabel.frame = CGRectMake(74, 180, 182, 64) 
    ViewTest.view.addSubview(ContentTitleLabel) 
    ContentTitleLabel.text = ContentTitle 
} 

} 

ответ

1

Чтобы следовать до MirekE's answer, вот некоторые другие шаги, которые вы можете рассмотреть:

  • Рассмотрим с помощью Auto Layout вместо жестко закодированных кадров, поэтому ваш интерфейс будет адаптироваться к различным классам размеров.

  • Рассмотрите альтернативные подходы к отображению интерактивного списка (изображений) вместо программных кнопок добавления. Например, вы можете использовать ячейку прототипа (представление таблицы или коллекции). Ячейки выбираются и могут занять место кнопки. Другие преимущества включают:

    • Прокручиваемый контейнер, если у вас есть больше кнопок, чем на экране.
    • Отдельный сегмент (или выбор) обрабатывается ячейкой прототипа раскадровки, вместо того чтобы заставить каждую программную кнопку «выполнить» выполнить сеанс (или действие). Поскольку вы знаете, какая ячейка выбрана, вам больше не понадобится тег, чтобы понять это.
  • Рассмотрите возможность передачи параметров контроллеру своего назначения, вместо того чтобы пытаться создать экземпляр и создать элементы управления в prepareForSegue. В этот момент точка назначения не загружается.

  • Рассмотрите возможность того, чтобы пользовательский интерфейс чувствовал себя более отзывчивым, например, выполнив segue и указав данные заполнителя, которые затем можно обновить после завершения сетевого запроса. В противном случае пользователю может потребоваться дождаться ответа сети до того, как произойдет segue (что может заставить их думать, что ничего не произошло и не нужно снова нажимать снова, что приводит к дополнительному сетевому запросу).

В общем, Apple (или кто-то другой) уже предоставил какой-то способ сделать то, что вы хотите, в идеале приводит к меньшим количеством кода, который вы должны написать, отладки, тестирования и сохранить, чтобы выполнить то, что вы хотите, чтобы ваши приложение делать.

1

Наиболее вероятной причиной проблемы является ваш призыв к parseJson с последующим prepareForSegue. parseJson является асинхронным, и вы не получаете данные обратно из своего сервиса до того, как вызывается prepareForSegue. В качестве первого шага переместите prepareForSegue в блок завершения parseJson.