此代码大部分直接来自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属性解决了这个问题。我希望有人能帮助我理解为什么我会看到这种行为。
答案 0 :(得分: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
属性,因此它会抛出有关私有方法的错误。虽然可能有办法解决这个问题,但我会避免使用与这些私有方法冲突的变量名称。