2012-05-11 2 views
0

Большая часть этого кода выводится непосредственно из образца RubyMotion Locations.Получение NoMethodError при доступе к NSManagedObject NSString в контроллере

я определил простой 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) 

I «Я попытался внести множество изменений в класс Text и TextStore (модель). До сих пор ничто не разрешило эту проблему. Я провел некоторое исследование в онлайн-документации Apple, но не нашел там никаких подсказок.

Я работал вокруг этого, используя основное свойство. Я надеюсь, кто-то может помочь мне понять, почему я вижу это поведение.

ответ

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 , поэтому вместо этого он генерирует ошибку для частного метода. Хотя может быть способ обойти это, я бы просто избегал иметь имена переменных, которые конфликтуют с этими частными методами.

+1

display - это метод, определенный на ядре ... для печати объекта в данный порт, возможно, его просто закрыли, чтобы избежать такого поведения в RubyMotion. –

+0

Я думал, что это может быть что-то вроде этого, но я ничего не мог найти в документации NSManagedObject. Оказывается, это на Ядре. Благодаря Paul.s – codewise

Смежные вопросы