2

Rubymotion の最新バージョンを使用して iOS アプリを作成しています。リモート API からのデータを入力したいテーブルビューを取得しました。

コントローラーに名前を付けました: ProjectsController

モデルに名前を付けました: Project

コントローラ viewDidLoad で、API からプロジェクトのリストを取得したいと考えています。Project モデルに load_projects という静的メソッドを作成しました。

def self.load_projects
 BW::HTTP.get("#{URL}projects?id=25&project_id=24&access_token=#{TOKEN}") do |response|
  result_data = BW::JSON.parse(response.body)
  output = result_data["projects"]
  output
 end
end

これはコントローラーの私のviewDidLoadです:

def viewDidLoad
 super
 @projects = Project.load_projects
 self.navigationItem.title = "Projekt"
end

モデルと同じ応答が viewDidLoad で得られません。モデル メソッドでは正しい応答データを取得しますが、viewDidLoad では「メタ」オブジェクトが返されます。BubbleWrap::HTTP::Query オブジェクト。私は何を間違っていますか?

1つ更新

以下の最初の回答を次のように使用しようとしましたが、エラーが発生します。

def tableView(tableView, cellForRowAtIndexPath:indexPath)
    cellIdentifier = self.class.name
    cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) || begin
      cell = UITableViewCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:cellIdentifier)
      cell
    end

    project = @projects[indexPath.row]['project']['title']
    cell.textLabel.text = project
    cell
  end

エラーは次のとおりです。

projects_controller.rb:32:in `tableView:cellForRowAtIndexPath:': undefined method `[]' for nil:NilClass (NoMethodError)
2012-11-09 01:08:16.913 companyapp[44165:f803] *** Terminating app due to uncaught exception 'NoMethodError', reason: 'projects_controller.rb:32:in `tableView:cellForRowAtIndexPath:': undefined method `[]' for nil:NilClass (NoMethodError)

ここで返されたデータをエラーなしで表示できます。

def load_data(data)
    @projects ||= data
    p @projects[0]['project']['title']
  end
4

1 に答える 1

3

ハ、まったく同じ問題を経験しました。

私が得た解決策は次のとおりです。

BW::HTTP メソッドは非同期であるため、self.load_projects メソッドは、必要な JSON データではなく、リクエスト オブジェクトを返します。

基本的に、BW:HTTP.get はすぐに実行を完了し、self.load_projects メソッドは正しくないデータを返します。

私に提案された解決策は次のとおりです。

ビュー コントローラーのデリゲートを受け入れるように、load_projects メソッドを変更します。

def self.load_projects(delegate)
  BW::HTTP.get("#{URL}projects?id=25&project_id=24&access_token=#{TOKEN}") do |response|
    result_data = BW::JSON.parse(response.body)
    delegate.load_data(result_data)
    delegate.view.reloadData
  end
end

テーブル ビュー コントローラーにインポートする場合は、データをリロードすることを忘れないでください。

デリゲートが load_data メソッドを呼び出していることに注意してください。そのため、View Controller がそれを実装していることを確認してください。

class ProjectsController < UIViewController

  #...

  Projects.load_projects(self)

  #...

  def load_data(data)
    @projects ||= data
  end
  #...
end

その後、@projects で好きなことをしてください

于 2012-11-08T21:27:49.807 に答える