Печать vc1 NSString из vc2

Я хочу распечатать vc1.string1 из vc2.

В настоящее время консоль показывает:

vc1.string1 (нуль)

Когда я не использовал раскадровку, я обращался к переменной vc1 следующим образом:

AppDelegate *appDelegate = [(AppDelegate *)[UIApplication sharedApplication]delegate];
NSLog(@"vc1.string1 %@", appDelegate.viewController.string1);

Но я не знаю, как получить доступ к vc1.string, когда использую раскадровку.

Помогите пожалуйста спасибо.

P.S. Вот ссылка на мой проект: http://dl.dropbox.com/u/12439052/AccessDiffClass.zip

//ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    NSString *string1;
}

@property (nonatomic, strong) NSString *string1;

@end

#import "ViewController.h"

@implementation ViewController
@synthesize string1;

-(void)viewDidLoad {
    string1 = @"String One";
    NSLog(@"string1 %@", string1);
}

@end

VC2:

//ViewController2.h

#import <UIKit/UIKit.h>

@class ViewController;

@interface ViewController2 : UIViewController {
    ViewController *vc1;
}

@property (nonatomic, strong) ViewController *vc1;

@end

#import "ViewController2.h"
#import "ViewController.h"

@implementation ViewController2
@synthesize vc1;

-(void)viewDidLoad {
    NSLog(@"vc1.string1 %@", vc1.string1);
}

@end

person Steve Ham    schedule 03.01.2012    source источник
comment
почему ты хочешь использовать сильный? обычно мы используем сохранение   -  person shader    schedule 03.01.2012
comment
Да, я использую ARC. Тяжело или плохо работать в такой среде, потому что она новая? Или я должен продолжать использовать его и использовать новую функцию.   -  person Steve Ham    schedule 03.01.2012
comment
Спасибо, @Michael Dautermann ... ну, я все еще привык управлять памятью самостоятельно ...   -  person shader    schedule 03.01.2012
comment
Я думал, что управление памятью вручную будет более эффективным? Неправильно?   -  person shader    schedule 03.01.2012
comment
@shader Да, это полностью детерминировано О ARC   -  person fabian789    schedule 03.01.2012


Ответы (2)


Я скачал ваш проект и добавил этот фрагмент кода в ваш файл ViewController.m:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog( @"preparing for segue" );
    ViewController2 * vc2 = [segue destinationViewController];
    vc2.vc1 = self;
}

И это привело к тому, что в моей консоли симулятора появилось то, на что вы надеялись.

Это определенно не лучшее, что можно здесь сделать. В мире ARC я не знаю, сохраняется ли vc1, происходит ли утечка или что-то в этом роде. Для вас было бы намного разумнее дать вашему классу ViewController2 свойство NSString *, которое устанавливается в методе prepareForSegue. А также дайте идентификатор вашему переходу.

Вот еще один вопрос StackOverflow, в котором немного больше говорится о prepareForSegue (и несколько подробнее).

person Michael Dautermann    schedule 03.01.2012
comment
На самом деле это не меняет значение string1 навсегда. Я хочу получить доступ к строке1 из vc2. Прежде чем я сделал это, сначала зайдя в Appdelegate, а затем перейдя в vc1. - person Steve Ham; 03.01.2012
comment
Можете ли вы попробовать с этим проектом, пожалуйста? dl.dropbox.com/u/12439052/AccessWithoutAuto.zip - person Steve Ham; 03.01.2012
comment
Я смог заставить ваш новый проект работать, просто добавив строку vc3.vc1 = self; в ваш метод действия toVC3: сразу после создания vc3. Для чего-то подобного, особенно если вы используете раскадровки, я бы рекомендовал просто добавить свойство NSString к вашему делегату приложения, а затем установить и прочитать его вместо того, чтобы пытаться сохранить вашу строку в одном конкретном контроллере представления (который исчезает и может быть выпускается, как только заканчивается анимация за пределами экрана). - person Michael Dautermann; 03.01.2012
comment
Спасибо, что продолжаете отвечать dl.dropbox.com/u/12439052/NoStory.zip Вот один проект, в котором я заставляю его работать с помощью ARC, но без раскадровки. Это потому, что в AppDelegate есть заранее написанный код, если я не использую Storyboard. Я попробовал @property (сильный, неатомарный) ViewController *viewController; & [[ViewController alloc]init] при использовании проекта ARC+Storyboard, но строка 1 окажется нулевой. - person Steve Ham; 03.01.2012
comment
Привет, Сын Юн! Я уже рассмотрел два проекта и надеюсь, что помог вам достаточно, чтобы вы могли определить, как лучше всего действовать для вашего приложения. - person Michael Dautermann; 03.01.2012

ошибся в прошлый раз, попробуй это.

Код ключа: appDelegate = (AppDelegate *)[[UIApplication sharedApplication] делегат]; vc1 = appDelegate.viewController; NSLog(@"string1 %@", vc1.string1);

http://dl.dropbox.com/u/12439052/passingValue.zip

person Community    schedule 04.01.2012