Передача объектов с помощью Segue

У меня проблемы с пониманием переходов и того, как они работают и передают объекты. В основном у меня есть калькулятор, и я пытаюсь построить график объектов, хранящихся в массиве. Пока у меня есть объект с именем мозг, который является экземпляром CalculatorBrain. Теперь у мозга есть свойство NSArray, которое я использую как стек для хранения переменных. Допустим, я добавляю значения 3 и 5 в массив, а затем хочу перейти. У меня есть переход, выбранный для кнопки под названием «График», поэтому, когда я нажимаю кнопку, она переходит. Как мне передать мозг новому контроллеру представления, к которому я перехожу? У меня есть свойство 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]];

person Terrel Gibson    schedule 19.07.2012    source источник
comment
Что происходит не так? Можно поконкретнее, что не работает?   -  person Nosrettap    schedule 20.07.2012
comment
Я просто не до конца понимаю как передавать и возражать и что именно передается   -  person Terrel Gibson    schedule 20.07.2012
comment
В этом примере вы передаете указатель на объект property. Это означает, что это ссылка на исходный передаваемый объект, а НЕ копия. Представьте, если бы я пальцем указывал на собаку. Внезапно ты подходишь ко мне. Затем я могу сказать вам, чтобы вы также использовали свой палец, чтобы указать на собаку. Мы оба имеем в виду ТОЧНО один и тот же объект (но обратите внимание, что собака на самом деле не двигается)   -  person Nosrettap    schedule 20.07.2012
comment
Я думал, что вы должны держать несколько MVC раскрытыми друг от друга, чтобы они не знали методы друг друга, будет ли указатель плохим? Кроме того, как мне вызвать метод, который находится в другом контроллере, без импорта файла и использования переходов   -  person Terrel Gibson    schedule 20.07.2012
comment
Вы должны держать MVC как можно более разделенными; однако вам все еще нужна некоторая способность общаться между ними. Если вас беспокоит, что классы слишком много знают друг о друге, используйте протоколы. Например, создайте протокол GraphPointUsing, определяющий метод setGraphingPoint. Таким образом, вам нужно импортировать только протокол, а не весь новый контроллер представления. Смотрите мой ответ ниже.   -  person Nosrettap    schedule 20.07.2012
comment
Что, если я не использую протоколы и вместо этого попытаюсь передать экземпляр класса, используя переходы, будет ли новый переданный объект иметь доступ к методам и свойствам в своем старом контроллере представления?   -  person Terrel Gibson    schedule 20.07.2012
comment
Он будет иметь доступ к методам и свойствам, объявленным в файле .h... (Это не совсем так, но для ваших целей достаточно близко к истине).   -  person Nosrettap    schedule 20.07.2012
comment
как бы я тогда назвал метод? Я попробовал это [self.graphingPoint METHODNAME]; но я не уверен, что это работает, так как это будет сеттер?   -  person Terrel Gibson    schedule 20.07.2012


Ответы (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];
person Nosrettap    schedule 19.07.2012
comment
Скорее всего, мне потребуется использовать протоколы, спасибо за вашу помощь, вы сделали ее намного понятнее для меня. - person Terrel Gibson; 20.07.2012
comment
Если это помогло, нажмите стрелку вверх и большую галочку слева от этого ответа :) - person Nosrettap; 20.07.2012