Ошибка установки свойства NSNumber контроллера представления назначения в prepareForSegue - PullRequest
1 голос
/ 04 января 2012

У меня есть модальный контроллер представления, который пытается установить флаг (свойство NSNumber) контроллера представления источника, который вызвал его в своем методе prepareForSegue. Он не может быть собран с ошибкой «Нет известного метода экземпляра для селектора setGoToEditNewNote:». Вот код:

Контроллер исходного представления .h:

@property (strong, nonatomic) NSNumber *goToEditNewNote;

Source View Controller .m:

@synthesize goToEditNewNote;
...

- (void)viewDidLoad
{
[super viewDidLoad];
    // clear the flag
    goToEditNewNote = [[NSNumber alloc] initWithBool:FALSE];
...

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
    if ([goToEditNewNote boolValue] == TRUE) {
        goToEditNewNote = FALSE;
        [self performSegueWithIdentifier: @"editNote" sender: self];
...

Контроллер модального представления .h:

Контроллер модального вида .m:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"done"]) 
    {
        [self done];
        [[segue destinationViewController] setGoToEditNewNote:TRUE]; <<< get error here
    }
}

Я подозреваю, что проблема может быть связана с тем, что goToEditNewNote не сохраняется при загрузке модального представления, но я не понимаю, почему нет. Я установил другие свойства, такие как managedObjectContext, аналогичным образом с успехом. Пожалуйста, будьте максимально точны в своем ответе, поскольку я новичок в ARC. Спасибо - Том

Ответы [ 4 ]

1 голос
/ 01 апреля 2012

У меня была такая же проблема.Это заняло у меня 2 дня, и я не смог найти правильный ответ в Интернете.Странно, тот же код в Stanford CS193p работает.К счастью, я решил это сейчас!Ошибка «установить свойство метода не может быть найдено», причина забывает #import "xxxx.h", где xxxx - имя контроллера представления вашего сегмента.Если вы не импортируете, он никогда не узнает, какие свойства у xxxx!

Легко, теперь переход работает.

1 голос
/ 04 января 2012

destinationViewController относится к типу id, который не содержит свойства goToEditNewNote.Вы, вероятно, хотите привести destinationViewController к типу SourceViewController.Обычно это предупреждение, но похоже, что вы воспринимаете все предупреждения как ошибки (я тоже так делаю).

Ваш -prepareForSegue:sender: должен выглядеть примерно так.

0 голосов
/ 04 января 2012

Ошибка говорит вам, что у вас нет метода экземпляра, который соответствует селектору "setGoToEditNewNote:";вы @синтезировали свою собственность (или сами писали аксессоры)?

0 голосов
/ 04 января 2012

Сначала, если вы используете ARC, вы НИКОГДА не должны использовать retain (или release). Вам нужно только создать экземпляр объекта, но вам не нужно заботиться об его удалении. Но будьте осторожны, если объекты ссылаются друг на друга по кругу. Если A ссылается на B, B ссылается на C, C ссылается на A, и вы получаете доступ к этим переменным через переменную D (которая указывает на A), и вы больше не используете D, круг A-B-C остается в памяти. Затем вы должны определить одну из ссылок A-B-C как «слабую».

Но на ваш реальный вопрос: возможно ли, что вы пропустили оператор @synthesize в файле реализации?

...