Передача переменной, которая может быть обновлена - PullRequest
0 голосов
/ 17 июня 2010

Это кажется простой вещью, но не может заставить ее работать.

Я передаю переменную в UIViewController через стандартное свойство:

[aViewController setProposedDate:proposedWorkLog.entryDate];

, которое сохраняетсяконтроллер, и, возможно, изменилось.Я проверил, что в контроллере данные изменяются.

Но после того, как он вытолкнут из стека и я смотрю в вызывающем представлении, данные не были обновлены.Есть ли способ передать эту переменную и сохранить ее новое значение или способ вернуть ответ от контроллера закрытия представления?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 06 января 2011

Если вы попытаетесь изменить свойство (entryDate) за спиной владельца (proposedWorkLog), это может привести ко многим побочным эффектам, таким как несогласованность и неправильное управление памятью.

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

entryDate выглядит как NSDate, который является неизменным, поэтому вы не можете его изменить; Вы должны заменить его новым экземпляром, который лучше всего сделать, вызвав правильный установщик.

2 голосов
/ 17 июня 2010

Вам нужно передать его по ссылке. Объекты в Objective-C передаются по ссылке, потому что они (обычно) являются указателями, но примитивы, с другой стороны, (обычно) не являются указателями. Поэтому вам нужно передать указатель на примитив с помощью оператора address-of (&).

Итак, ваш код должен выглядеть так:

[aViewController setProposedDate:&proposedWorkLog.entryDate];

Затем вам нужно изменить прототип вашего метода, чтобы он брал указатель на тип примитива (скажем, int *).

Посмотрите, как обработка ошибок с помощью NSError работает в Objective-C, она использует эту методологию повсеместно. http://www.cimgf.com/2008/04/04/cocoa-tutorial-using-nserror-to-great-effect/

0 голосов
/ 07 января 2011

Я полностью согласен с @Eiko.Вы должны думать об этом немного по-другому.В C ++ вы можете делать такие вещи, как void flipTheseTwo(int* x, int* y), но я вполне уверен, что это плохая форма для Objective-C (и сохранять объекты памяти).

Вот мое предложение.Используйте @property (assign) MYWorklog worklog; @synthesize worklog = _worklog;

[aViewController setWorklog:proposedWorkLog];
[UINavicationController pushViewController: aViewController animated:YES]; // this syntax might be wrong.  Mac is not near me. :(

...

(IBAction) updateProposedDate:(id)sender
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"EEEE MMMM d, YYYY"];
    _worklog.entryDate = [dateFormat dateFromString:[sender stringValue]];  
    [dateFormat release];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...