2012-02-29 3 views
0

РЕШЕНИЕ НИЖЕ - Не проблема, я так и думал.Невозможно установить свойство в prepareForSegue: отправитель:

Я добавляю данные к контроллеру вида, который вызывается, используя prepareForSegue: sender :, но проблема в том, что если данные заданы с использованием свойства, то это свойство не изменяется. Однако я могу использовать закрытую переменную контроллера представления назначения, используя функцию, созданную для этой цели.

Вот код, который работает:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([[segue identifier] isEqualToString:@"showLocationDetail"]) { 
     CityGuideFlipsideViewController *flipside = [segue destinationViewController]; 
     CityGuideAnnotation *senderAnnotation = (CityGuideAnnotation *)sender; 
     [flipside annotate:senderAnnotation]; // why? 
    } 
} 

кажется гораздо более естественным, однако, использовать flipside.annotate = senderAnnotation чем [flipside annotate:senderAnnotation].

Конечно, я должен делать что-то очевидное здесь, но я не могу это заметить.

EDIT, чтобы дать сбой дела более ясно:

// CityGuideFlipsideViewController.h 
@interface CityGuideFlipsideViewController : UIViewController { 
    CityGuideAnnotation *annotation; 
} 
@property (strong, nonatomic) CityGuideAnnotation *annotation; 

// CityGuideFlipsideViewController.m 
@synthesize annotation; 
- (void)setAnnotation:(CityGuideAnnotation *)_annotation 
{ 
    annotation = _annotation; 
} 

// CityGuideMainViewController.m (in prepareForSegue:sender) 
CityGuideFlipsideViewController *flipside = [segue destinationViewController]; 
CityGuideAnnotation *senderAnnotation = (CityGuideAnnotation *)sender; 
flipside.annotation = senderAnnotation; 

Достигнув линии назначая flipside.annotation, как senderAnnotation значение senderAnnotation правильно. flipside.annotation перед назначением - nil. Вслед за этой строкой senderAnnotation не изменяется, flipside.nnation не изменяется.

НО, достигнув CityGuideFlipsideViewController viewDidLoad У меня есть NSLog(@"%@",annotation.title), который выплескивает правильное значение, хотя отладчик все еще показывает мне ноль для аннотации.

Так что я действительно не уверен, что раньше у меня была небольшая ошибка, если я все время обманывал annotation CityGuideAnnotation * 0x00000000 в отладчике.

Извините, и спасибо тем, кто помог.

+0

Возможно ли, что раньше вы не отправляли отправителя правильно или вообще. Я заметил, что вы добавили его в CityGuideAnnotation в успешный код, но не в этом примере. – CodaFi

+0

Пожалуйста, дайте объявление и реализацию «аннотировать». Свойства предназначены для установки ivars, а эквивалентный метод setter для 'x.annotate = y' должен быть' [x setAnnotate: y] '. – jrturton

ответ

0

Ошибка не в коде, используя свойство. Я был обманут отладчиком, показывающим нуль как указатель. Я буду более осторожен в регистрации значений в будущем.

Для получения более подробной информации см. Править на вопрос выше.

1

Если аннотация является частной собственностью в точке назначения vc, то отправитель VC не может получить к ней доступ (кроме установленного вами аннотата: метод). prepareForSegue не дает никакого специального доступа к destinationVC, в данном случае частной собственности. Если вы хотите использовать точечную нотацию, вам нужно будет опубликовать аннотацию как часть общедоступного API.

Я надеюсь, что я понял ваш вопрос правильно :-)

Удачи,

Damien

+0

К сожалению, он не был закрыт. Кроме того, компилятор не выдавал ошибку, а оставил flipside.notation unset. – Djehuty

+1

Разве это розетка? Розетки не подключены в пункте назначения vc во время подготовкиForSegue. –

+0

Спасибо за помощь Дэмиен, извините, что раньше не выяснял отладчика. – Djehuty

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