草庐IT

ios - Swift (iOS) - PickerView 未被 HTTP GET 请求填充

coder 2023-09-09 原文

我将该类链接到我系统上的新用户注册。

class ProfileNewAddressViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

  // MARK: Properties
  @IBOutlet weak var streetTextField: UITextField!
  @IBOutlet weak var streetComplementTextField: UITextField!
  @IBOutlet weak var zipCodeTextField: UITextField!
  @IBOutlet weak var stateTextField: UITextField!
  @IBOutlet weak var countryTextField: UITextField!

  @IBAction func saveNewAddressPressed(sender: UIButton) {
  }

  var countries:[String]  = []

  let countriesPicker = UIPickerView()

  func populateCountries() {
    countries = RestApiManager.sharedInstance.getCountries()!
    countriesPicker.reloadAllComponents()
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    populateCountries()

    countriesPicker.delegate = self
    countriesPicker.dataSource = self
    countryTextField.inputView = countriesPicker

  }

  func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
  }

  func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

      return countries.count

  }

  func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
  {

      return countryTextField.text = countries[row]
  }

  func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
      return countries[row]
  }

在这段代码中,我调用下面列出的函数 getCountries:

func getCountries() -> [String]? {
    var countries:[String] = []

    makeHTTPGetRequest(baseURL + "countries", parameters: ["page_size": "0"], completionHandler: { (data, response, error) in
      let data = data

      do {
        let jsonResult:NSArray = try NSJSONSerialization.JSONObjectWithData(data!, options:[]) as! NSArray
        for var i = 0; i < jsonResult.count; ++i {
          var countriesDict = jsonResult.objectAtIndex(i) as! NSDictionary
          countries.append(countriesDict["title"] as! String)
        }
      }

      catch {
        print("Error: \(error)")
      }
    })
    return countries
  }

调用 HTTP GET:

private func makeHTTPGetRequest(path: String, parameters: [String: AnyObject], completionHandler: (NSData?, NSURLResponse?, NSError?) -> Void) -> NSURLSessionTask {
    let parameterString = parameters.stringFromHttpParameters()
    let requestURL = NSURL(string:"\(path)?\(parameterString)")!

    let request = NSMutableURLRequest(URL: requestURL)
    request.HTTPMethod = "GET"
    //request.setValue("Bearer " + userInfoDefaults.stringForKey("accessToken")!, forHTTPHeaderField: "Authorization")
    request.setValue("Bearer diU8PIBuGHHlvD5PKstRDRbHdCEMxpb5", forHTTPHeaderField: "Authorization")

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request, completionHandler:completionHandler)
    task.resume()

    return task
  }

出于某种原因,我的 pickerView 没有在屏幕上显示任何值。我已经调试了代码并注意到国家数组正在填充正确的值。我需要以任何方式重新加载某些组件才能正常工作吗?

最佳答案

看起来您在完成处理程序期间正在后台填充国家/地区。该代码在完成网络调用之前不会填充国家/地区数组,但您会立即重新加载选择器。我建议在填充数组后调用 getCountries 函数内的 lickers reloadAllComponents,但看起来该调用在另一个对象中,因此可能会在填充数组后调用的 getCountries 函数中添加一个回调(完成处理程序)。您必须从主线程调用选择器的 reloadAllComponents。

  func populateCountries() {
          countries = RestApiManager.sharedInstance.getCountries!({
              dispatch_async(dispatch_get_main_queue()){ 
                  countriesPicker.reloadAllComponents() 
          })
      }
  }

那么getCountries可以是这个

func getCountries(handler:()->Void) -> [String]? {
    var countries:[String] = []

    makeHTTPGetRequest(baseURL + "countries", parameters: ["page_size": "0"], completionHandler: { (data, response, error) in
      let data = data

      do {
          let jsonResult:NSArray = try  NSJSONSerialization.JSONObjectWithData(data!, options:[]) as! NSArray
          for var i = 0; i < jsonResult.count; ++i {
              var countriesDict = jsonResult.objectAtIndex(i) as! NSDictionary
              countries.append(countriesDict["title"] as! String)
          }
       }

       catch {
          print("Error: \(error)")
       }
       handler()
   })
   return countries
}

关于ios - Swift (iOS) - PickerView 未被 HTTP GET 请求填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37138889/

有关ios - Swift (iOS) - PickerView 未被 HTTP GET 请求填充的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  10. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

随机推荐