【问题标题】:Passing Objects using Segue使用 Segue 传递对象
【发布时间】:2012-07-19 21:00:58
【问题描述】:

我无法理解 segues 以及它们如何工作和传递对象。基本上我有一个计算器,并试图绘制存储在数组中的对象。到目前为止,我有一个名为 Brain 的对象,它是 CalculatorBrain 的一个实例。现在,brain 有一个 NSArray 属性,我将其用作堆栈来存储变量。假设我将值 3 和 5 添加到数组中,然后想要继续。我将我的 segue 选择到一个名为“Graph”的按钮上,所以当我单击该按钮时,它会继续。我如何将大脑传递给我正在使用的新视图控制器?我有一个名为 setGraphingPoint 的属性,它在我认为应该接受传递的对象的新视图控制器中定义。另外,如果我通过一个 segue 传递大脑,值 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]];

【问题讨论】:

  • 怎么了?你能更具体地说明什么不起作用吗?
  • 我只是不完全理解如何传递和反对以及传递的究竟是什么
  • 在这个例子中,你传递了一个指向对象property的指针。这意味着它是对正在传递的原始对象的引用,而不是副本。想象一下,如果我用手指指着一只狗。突然你走到我身边。然后我可以告诉你也用你的手指指向狗。我们都指的是完全相同的对象(但请注意,狗实际上并没有移动)
  • 我认为您应该保持多个 MVC 相互公开,这样他们就不知道彼此的方法,指针会是一件坏事吗?另外,如何在不导入文件和使用 segues 的情况下调用另一个控制器中的方法
  • 你应该让 MVC 尽可能地分开;但是,您仍然需要一些在它们之间进行通信的能力。如果您担心类对彼此了解太多,请使用协议。例如,创建一个定义setGraphingPoint 方法的GraphPointUsing 协议。这样你只需要导入协议而不是整个新的视图控制器。请参阅下面的答案。

标签: objective-c xcode properties segue cs193p


【解决方案1】:

您可以使用协议。例如,你可以让你的 prepareForSegue 看起来像这样:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    id destination = segue.destinationViewController;
    if([destination conformsToProtocol:@protocol(GraphPointUsing)])
        [destination setGraphingPoint:[self.brain program]];
}

那么你只需要确保你要遵循的 ViewController 符合GraphPointUsing

如果您不想使用协议,但仍想在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];

【讨论】:

  • 我很可能需要使用协议,谢谢你的帮助,你让我更清楚了
  • 如果有帮助,请单击此答案左侧的向上箭头和大复选标记 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2012-11-24
相关资源
最近更新 更多