如何从 prepareForSegue 调用“自我”属性:?
Posted
技术标签:
【中文标题】如何从 prepareForSegue 调用“自我”属性:?【英文标题】:How to call a 'self' property from prepareForSegue:? 【发布时间】:2012-11-18 22:35:59 【问题描述】:我的应用的模型类中有一个@property
,它将调用prepareForSegue:
。在我的 CalculatorBrain
课程中公开声明是这样的。
@property (readonly) id program.
getter 看起来像这样:
- (id)program
return [self.programStack copy];
如果您需要知道,programStack
是 CalculatorBrain
的 NSMutableArray @property
,用于存储用户输入的所有操作和操作数。
计算器的控制器是CalculatorViewController
,我有一个私有的大脑属性(一个CalculatorBrain)。在我所有的 CalculatorViewController 方法中,我可以完美地调用self.brain.program
。但是当我尝试从我的prepareForSegue:
方法中调用这个getter 时,它会返回一个空数组。这是我在 CalculatorViewController 中可以完美调用 self.brain.program 的方法示例:
- (IBAction)enterPressed
[self.brain pushOperand:[self.display.text doubleValue]];
self.userIsInTheMiddleOfEnteringANumber = NO;
// update history label
NSArray *stack = self.brain.program; //This is to test self.brain.program
self.history.text = [CalculatorBrain descriptionOfProgram:self.brain.program];
如果我们在 self.history.text... 行设置断点检查值,我们会得到以下结果:
没错,当时程序有 2 个对象。
现在这是我的prepareForSegue:
方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"Graph"])
GraphingCalcViewController *newController = segue.destinationViewController;
// send program to newController
NSArray *stack = self.brain.program; //This is to test self.brain.program
newController.program = self.brain.program;
如果我们在 newController.program... 行中设置断点,我们会得到以下结果:
两个快照来自同一次运行。所以我的问题是,为什么 self.brain.program 的值在 prepareForSegue: 调用时会有所不同?也许这是一个非常愚蠢的错误,但我无法发现它。我会很感激这里的一些帮助。我对 ios 开发还很陌生。
更新:问题似乎出在 programStack 上。在prepareForSegue:
方法发挥作用之前,它以某种方式出现了niling
。所以当这个运行时,我们会得到新的空程序堆栈。其他一些方法(据我所知不是我的)正在清除它。
任何人都知道什么可能会在这里清理我的财产?我有两个strong
指针指向brain
(CalculatorViewController 中的CalculatorBrain *)和programStack
(CalculatorBrain 中的NSMutableArray *)。
【问题讨论】:
请在 GraphingCalcViewController.h 中发布 newController.program 的公开声明,并将 id 更改为 NSMutableArray。将其声明为 id 是没有意义的。 【参考方案1】:我的 CS193 代码非常相似,我看到的主要区别是我传递了程序的副本而不是对同一对象的引用。所以试试这个:
newController.program = [self.brain.program copy];
【讨论】:
刚试了一下,没用 :( 但是我确实发现了一些东西。我的programStack
不知何故提前清除了。我在上面帖子的更新中添加了一些细节。
我会尝试将 NSLog 语句添加到程序属性的设置器中,这样您就可以看到它何时被调用。【参考方案2】:
getter for program 使用programStack
上的复制方法进行赋值,这需要programStack
遵守NSCopying
协议。 programStack
真的只是 NSMutableArray
吗?因为这确实遵守NSCopying
并且应该可以工作。尝试取出副本?
更新:self.brain
的值在两次调用之间是否发生变化?
【讨论】:
他在做cs193p。它只是一个普通的 NSMutableArray。我的图形计算器工作正常。我在我构建的作业计算器中的prepareForSegue
工作正常,而且几乎完全相同。 :\
因为它是一个副本,如果在程序主体中执行 [stack addObject:something],将产生与 [self.brain.program addObject:something] 不同的结果。这是发生在某个地方吗?
@Metabble 是对的。我正在做 cs193p,它只是一个普通的 NSMutableArray。现在,emrys57,我不能向其中任何一个发送“addObject:”消息,因为堆栈是一个简单的测试 NSArray,并且大脑的程序属性是“只读”,它甚至没有实例变量来存储一些东西。它的工作是返回 NSMutableArray programStack 的副本。 Metabble:所以你的 GraphController 得到了一个正确版本的程序,使用了我做的相同的 prepareForSegue 方法?这让我毛骨悚然:\
我能看到的唯一区别是我嵌套在一个更小的空间中。 if([segue.identifier isEqualToString: @"graph"]) [segue.destinationViewController setProgram:self.brain.program];
是我的全部内容。问题可能存在于其他地方。以上是关于如何从 prepareForSegue 调用“自我”属性:?的主要内容,如果未能解决你的问题,请参考以下文章
未从自定义 uitableviewcell 调用 prepareForSegue
prepareForSegue 在 performSegue 之前调用
performSegueWithIdentifier 替换 detailViewController 有效,但没有调用 prepareForSegue