2012-06-27 6 views
1

У меня есть SourceViewController и DesViewController, есть переменная в DesViewController: @property (nonatomic , assign , readwrite) NSString* name ;не может установить свойство

, но вот проблема, когда я вызываю метод в SourceViewController:

-(void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender { 
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil ] ; 
    DestinationViewController* desViewController = [storyboard instantiateInitialViewController ] ; 
    desViewController.name = @"haah" ; 
    [self presentViewController:desViewController animated:YES completion:nil ] ; 
} 

выход:

'NSInvalidArgumentException', reason: '-[SourceViewController setName:]: unrecognized selector sent to instance 0x6a0d7c0' 

Может ли кто-нибудь помочь мне, пожалуйста?

+0

Вы уверены, что исходный контроллер представления устанавливается как 'DesViewController' и не' SourceViewController'? – Vervious

+0

Возможно, это не так, как я могу решить эту проблему? – Weizhi

+0

Вы в делете делегата? Часто возникают проблемы, если это так. – achi

ответ

0

Как сейчас, созданный вами viewcontroller не выглядит как класс DestinationViewcontroller (поскольку ваш начальный viewController, похоже, не относится к этому классу). Так что у этого нет этого свойства. Вы должны создать экземпляр правильного класса (см. Ниже). Также проверьте, было ли вы синтезировано свойство в реализации DestinationViewcontroller.

И на стороне примечания: хотя вы можете просто назначить строковую переменную новому значению, большую часть времени вы хотели бы использовать для копирования вместо назначения на NStrings. Кроме того, readwrite не требуется, так как его поведение по умолчанию. Таким образом, лучше изменить свое объявление свойства таким образом:

@property (nonatomic, copy) NSString *name; 

И в проверке реализации, если синтезировать, например, так:

@synthesize name = _name; 

И в вашем dealloc:

[_name release]; 

Кроме того, рассмотрите возможность использования ARC, если вы ставите новый проект.

Теперь, если вы сделаете свой viewController DestinationViewcontroller, он должен работать. Лучший способ получить это будет

DestinationViewcontroller *dc = [storyboard instantiateViewControllerWithIdentifier:@"identifier of your desviewcontroller"]; 
0

Вы инициализируете недвижимость на SourceViewController при попытке присоединиться от DestinationViewController.

Вам необходимо создать объект для строительства DestinationViewController.

1

следующую строку кода:

[storyboard instantiateInitialViewController ] ; 

возвращает SourceViewController. Это потому, что он установлен как ваш начальный viewController. Однако вы рассматриваете его как DestinationViewController. Отсюда и проблема.

Либо измените свой первоначальный контроллер, либо объявите и синтезируйте свойство для SourceViewController.

+0

Да, лучше проверить, что возвращает [storyboard instantiateInitialViewController]. Вы можете легко сделать это, приняв объект в идентификатор, а затем соответствующим образом наберите «cast». – Tarun

+0

Я решил это, спасибо – Weizhi

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