0

大部分代码直接来自 RubyMotion Locations 示例。

我定义了一个简单的 NSManagedObject:

class Text < NSManagedObject
  def self.entity
    @entity ||= begin
      # Create the entity for our Text class. The entity has 2 properties. 
      # CoreData will appropriately define accessor methods for the properties.
      entity = NSEntityDescription.alloc.init
      entity.name = 'Text'
      entity.managedObjectClassName = 'Text'
      entity.properties = ['main', NSStringAttributeType,'display',NSStringAttributeType].each_slice(2).map do |name, type|
            property = NSAttributeDescription.alloc.init
            property.name = name
            property.attributeType = type
            property.optional = false
            property
          end
      entity
    end
  end 
end

我似乎无法访问控制器内的显示方法:

def tableView(tableView, cellForRowAtIndexPath:indexPath)
    cell = tableView.dequeueReusableCellWithIdentifier(CellID) || UITableViewCell.alloc.initWithStyle(UITableViewCellStyleSubtitle, reuseIdentifier:CellID)
    text = TextStore.shared.texts[indexPath.row]

    cell.textLabel.text = text.display
    cell.detailTextLabel.text = text.main[0,10] + "...."
    cell
  end

我不断收到此异常:

Terminating app due to uncaught exception 'NoMethodError', reason: 'text_controller.rb:40:in `tableView:cellForRowAtIndexPath:': private method `display' called for #<Text_Text_:0x8d787a0> (NoMethodError)

我尝试对 Text 类和 TextStore 类(模型)进行各种更改。到目前为止,还没有解决这个问题。我在 Apple 的在线文档中进行了一些研究,但没有找到任何线索。

我已经通过使用 main 属性来解决它。我希望有人可以帮助我理解为什么我会看到这种行为。

4

1 回答 1

2

尽管我在任何地方都找不到它的文档,但它似乎display是 RubyMotion 中几乎每个对象的私有方法。display除非您指定属性,否则即使是完全空白的类也会引发异常:

(main)>> class Foo; end
=> nil
(main)>> f = Foo.new
=> #<Foo:0x8ee2810>
(main)>> f.display
=> #<NoMethodError: private method `display' called for #<Foo:0x8ee2810>>

(main)>> class Foo; attr_accessor :display; end
=> nil
(main)>> f = Foo.new
=> #<Foo:0xa572040>
(main)>> f.display
=> nil

我的猜测是,在 NSManagedObject 的工作方式中,它最初并不知道被管理的对象有一个display属性,所以它会抛出关于私有方法的错误。虽然可能有办法解决这个问题,但我会避免使用与这些私有方法冲突的变量名。

于 2012-05-11T13:52:52.973 回答