【问题标题】:Load data in new view when button is clicked with swift快速单击按钮时在新视图中加载数据
【发布时间】:2016-01-11 11:13:59
【问题描述】:

我正在开发一个应用程序,我在其中以编程方式创建按钮。当我点击一个按钮时,它会从数据库中请求数据并在另一个视图中显示。

我使用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
}

}

【问题讨论】:

    标签: swift button ios9.2


    【解决方案1】:

    要跟进MirekE's answer,您可能需要考虑以下其他步骤:

    • 考虑使用自动布局来代替硬编码的框架,这样您的 UI 就能适应不同的尺寸类别。

    • 考虑显示交互式(图像)列表的替代方法,而不是以编程方式添加按钮。例如,您可以使用原型(表格视图或集合视图)单元格。单元格是可选择的并且可以代替按钮。其他好处包括:

      • 一个可滚动的容器,如果您的按钮数量超过了屏幕的容量。
      • 故事板原型单元处理单个转场(或选择),而不需要让每个程序化“按钮”执行转场(或动作)。由于您知道选择了哪个单元格,因此您不再需要标签来确定这一点。
    • 考虑将参数传递给目标视图控制器,而不是尝试在 prepareForSegue 中实例化和创建控件。此时未加载目的地的视图。

    • 考虑让 UI 感觉更灵敏,例如通过执行 segue 并显示占位符详细信息,然后您可以在网络请求完成后更新这些详细信息。否则,用户可能不得不在 segue 发生之前等待网络响应(这可能会让他们认为没有发生任何事情并不必要地再次点击,从而导致额外的网络请求)。

    一般来说,Apple(或其他人)已经提供了一些方法来做你想做的事,理想情况下,你必须编写、调试、测试和维护的代码更少,以完成你想让你的应用程序做的事情。

    【讨论】:

      【解决方案2】:

      问题的最可能原因是您拨打了parseJson,然后拨打了prepareForSegueparseJson 是异步的,在调用 prepareForSegue 之前您不会从服务中取回数据。第一步,将prepareForSegue 移动到parseJson 的完成块。

      【讨论】:

        猜你喜欢
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多