2012-01-03 4 views
1

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

Source View Controller .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]; 
... 

модального View Controller .h:

Модального View Controller .й :

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

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

ответ

1

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

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     [self done]; 
     SourceViewController *sourceViewController = (SourceViewController *)[segue destinationViewController]; 
     [sourceViewController setGoToEditNewNote:[NSNumber numberWithBool:YES]]; 
    } 
} 
+1

А также вы устанавливаете значение BOOL в свойство NSNumber, вы должны получить предупреждение Compiler об этом, а не Runtime error, но возможно, что это соответствует заданию, описанному Mark –

+0

. Вы правы. Передача BOOL в NSNumber приведет к ошибке сегментации. Я обновил свой код. OP, есть ли причина, по которой вы не просто используете «BOOL» для начала? –

+0

@M и @D. Я сделал это, как было предложено, и ошибка исчезла, однако набор не вернулся к контроллеру исходного вида. Я регистрирую значение сразу после того, как он был установлен в segue, и сообщил, что goToEditNewNote = 1, как и ожидалось. Затем я зарегистрировал значение в методе viewWillAppear контроллера представления исходного кода. Он сообщил goToEditNewNote = 0; Марк, изначально я использовал BOOL, но перешел на NSNumber, пытаясь решить или понять больше о проблеме. Связана ли эта ссылка? http://www.ifans.com/forums/showthread.php?t=183427. Добавление установщика не помогло мне решить эту проблему. –

0

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

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

+0

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

+0

нет круговой справки. Только хотите использовать шанс дать «Руководство по трехпозициям для ARC». –

0

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

+0

Я обновил свой вопрос, чтобы включить оператор synhesize, который уже был в моем коде, поэтому есть что-то еще неправильное. –

1

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

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

+0

Прошло некоторое время с тех пор, как я опубликовал эту проблему, но я думаю, что вы правы. С тех пор я поймал ваше предложение. Спасибо, что опубликовали его. –

+0

Добро пожаловать, если только мы все помогаем друг другу. Я очень рад за то, что заработал первое место здесь. – WHT

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