Objective c 使用Segue传递对象

Objective c 使用Segue传递对象,objective-c,xcode,properties,segue,cs193p,Objective C,Xcode,Properties,Segue,Cs193p,我很难理解分段以及它们如何工作和传递对象。基本上,我有一个计算器,并试图将存储在数组中的对象绘制成图形。到目前为止,我有一个叫做brain的物体,它是CalculatorBrain的一个实例。现在brain有一个NSArray属性,我用它作为堆栈来存储变量。假设我将值3和5添加到数组中,然后想要分段。我选择了一个名为“Graph”的按钮,因此当我单击该按钮时,它会进行分段。我将如何将大脑传递给我正在使用的新视图控制器?我有一个名为setGraphingPoint的属性,它是在新的视图控制器中定义

我很难理解分段以及它们如何工作和传递对象。基本上,我有一个计算器,并试图将存储在数组中的对象绘制成图形。到目前为止,我有一个叫做brain的物体,它是CalculatorBrain的一个实例。现在brain有一个NSArray属性,我用它作为堆栈来存储变量。假设我将值3和5添加到数组中,然后想要分段。我选择了一个名为“Graph”的按钮,因此当我单击该按钮时,它会进行分段。我将如何将大脑传递给我正在使用的新视图控制器?我有一个名为setGraphingPoint的属性,它是在新的视图控制器中定义的,我认为它应该接受传递的对象。另外,如果我把大脑通过一个序列,那么3和5的值会随它一起传递吗?还是它会创建一个新的CalculatorBrain对象?这是我到目前为止所拥有的

这是在新的视图控制器中定义的

@property (nonatomic, strong) CalculatorBrain *graphingPoint;
@synthesize graphingPoint = _graphingPoint;

-(void) setGraphingPoint:(CalculatorBrain*) graphingPoint{

_graphingPoint = graphingPoint;
[self.graphingView setNeedsDisplay];

}
这是从旧的视图控制器中调用的,该控制器将有按钮进行分段

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

if([segue.identifier isEqualToString:@"Graph"])
    [segue.destinationViewController setGraphingPoint:[self.brain program]];

你可以使用协议。例如,您可以使您的prepareForSegue如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    id destination = segue.destinationViewController;
    if([destination conformsToProtocol:@protocol(GraphPointUsing)])
        [destination setGraphingPoint:[self.brain program]];
}
然后,您只需使用,确保您要使用的ViewController符合
图形点

如果不想使用协议,但仍想调用
GraphPoint
上的方法,则可以执行以下操作:

//In new ViewController suppose we want to call the method `foo` on `GraphPoint`
[self.graphingPoint foo];

//Or if we want to call a setter we can do
[self.graphingPoint setFoo:5];

怎么了?您能更具体地说明什么不起作用吗?我只是不完全理解如何传递和对象以及究竟传递了什么在本例中,您传递的是指向对象
属性的指针。这意味着它是对正在传递的原始对象的引用,而不是副本。想象一下,如果我用手指指着一条狗。突然你走到我旁边。然后我可以告诉你用你的手指指着狗。我们都指的是完全相同的对象(但请注意,狗实际上并没有移动),我想你应该让多个MVC彼此公开,这样它们就不知道彼此的方法了,指针会是一件坏事吗?另外,我如何调用另一个控制器中的方法而不导入文件并使用seguesYou应该尽可能保持mvc之间的分离;但是,您仍然需要一些在他们之间进行沟通的能力。如果您担心类之间相互了解太多,请使用协议。例如,使用定义
setGraphingPoint
方法的
protocol创建一个
graphpoint。这样,您只需导入协议,而不必导入整个新的视图控制器。请参阅下面我的答案。我很可能需要使用协议,谢谢您的帮助。您让我更清楚了。如果有帮助,请单击此答案左侧的向上箭头和大复选标记:)