0

私は RubyMotion と MotionModel を試してきました。MotionModel チュートリアル全体 ( https://github.com/sxross/MotionModel/wiki/Tutorial ) を実行しましたが、モデル データのシリアル化と永続的な保存については説明していません。

データをシリアル化して保存し、通知を使用してフォーム データを (再) ロードできましたが、アプリの起動時にモデル データを適切にロードできないようです。空の tableView を取得し、モデルの新しいインスタンスを作成すると、すべてのデータが一度に表示されます。私はそれが単純なことだと知っていますが、私はそれを見ていません。

AppDelegate:

class AppDelegate
  attr_reader :window

  def application(application, didFinishLaunchingWithOptions:launchOptions)

    controller = EntryController.alloc.init 

    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = UINavigationController.alloc.initWithRootViewController(controller)
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible

    Entry.deserialize_from_file('entries.dat')

    true
  end
end

コントローラ:

MotionModelDataDidChangeNotification = 'MotionModelDataDidChangeNotification'

class EntryController < UIViewController

  def viewDidLoad
    super

    self.title = "Entries"

    @entry_model_change_observer = App.notification_center.observe MotionModelDataDidChangeNotification do |notification|
      if notification.object.is_a?(Entry)
        reload_data
      end
    end

    #create and add tableview
    @table = UITableView.alloc.initWithFrame([[0,0],[320,480]])
    @table.dataSource = @table.delegate = self
    self.view.addSubview @table

    ##adds top right "new" button
    right_button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemAdd, target:self, action:"new_entry")
    self.navigationItem.rightBarButtonItem = right_button

  end

  def viewWillDisappear(animated)
    App.notification_center.unobserve @task_model_change_observer
  end

  def reload_data
    @entries = Entry.all
    @table.reloadData
  end

  def new_entry       
    Entry.create :details => "New entry"
  end

  def numberOfSectionsInTableView(view)
    1
  end

  def tableView(tableView, numberOfRowsInSection: section)
    Entry.count
  end

  def tableView(tableView, cellForRowAtIndexPath: indexPath)
    @reuseIdentifier ||= "entry_cell"
    cell = tableView.dequeueReusableCellWithIdentifier(@reuseIdentifier) || begin
      UITableViewCell.alloc.initWithStyle UITableViewCellStyleSubtitle, reuseIdentifier:@reuseIdentifier
    end

    entry = @entries[indexPath.row]

    cell.textLabel.text = entry.details
    cell.detailTextLabel.text = entry.details
    cell
  end


  def tableView(tableView, didSelectRowAtIndexPath:indexPath)
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
  end
end

reload_dataそのメソッドのコードのさまざまな表現を 呼び出して内部に埋め込んでみましviewDidLoadたが、どこにも行きませんでした。どんなガイダンスも大歓迎です!

4

1 に答える 1

0

理解した。メソッドに移動Entry.deserialize_from_file('entries.dat')する必要がありましたEntryController viewDidLoad。それを作る:

  def viewDidLoad
    super

    self.title = "Entries"

    Entry.deserialize_from_file('entries.dat')
    @entries = Entry.all

    @entry_model_change_observer = App.notification_center.observe MotionModelDataDidChangeNotification do |notification|
      if notification.object.is_a?(Entry)
        reload_data
      end
    end

    #create and add tableview
    @table = UITableView.alloc.initWithFrame([[0,0],[320,480]])
    @table.dataSource = @table.delegate = self
    self.view.addSubview @table

    ##adds top right "new" button
    right_button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(UIBarButtonSystemItemAdd, target:self, action:"new_entry")
    self.navigationItem.rightBarButtonItem = right_button

  end
于 2013-06-26T03:49:29.953 に答える