如何从 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];

如果您需要知道,programStackCalculatorBrainNSMutableArray @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 调用“自我”属性:?的主要内容,如果未能解决你的问题,请参考以下文章

如何从地图图钉上的披露按钮调用 segue?

未从自定义 uitableviewcell 调用 prepareForSegue

prepareForSegue 在 performSegue 之前调用

performSegueWithIdentifier 替换 detailViewController 有效,但没有调用 prepareForSegue

如何使用 prepareForSegue 从二维数组传递值

如何使用 prepareForSegue 从 UIButton 传递字符串