这似乎很简单,但无法让它发挥作用。
我将一个变量传递给一个标准属性的UIViewController:
[aViewController setProposedDate:proposedWorkLog.entryDate];
由控制器保留,可能已更改。我已经验证在控制器中,数据已被修改。
但是,在弹出堆栈并查看调用视图后,数据尚未更新。有没有办法传递这个变量并让它保留新值,或者从关闭视图控制器传回响应的方法?
谢谢!
答案 0 :(得分:3)
如果您尝试修改所有者(entryDate
)后面的属性(proposedWorkLog
),则可能会出现许多副作用,例如不一致和内存管理不善。
我强烈建议采用不同的路线,可以通过proposedWorkLog
并为其上的新属性调用setter。
entryDate
看起来就像一个不可变的NSDate,所以你无法改变它;你必须用一个新实例替换它,最好通过调用正确的setter来完成。
答案 1 :(得分:2)
您需要通过引用传递它。 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/
答案 2 :(得分:0)
我非常赞同@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];
}