Отпечатване на 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
защо искаш да използваш силна? обикновено използваме retain   -  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. И също така дайте идентификатор на вашия segue.

Ето още един въпрос на StackOverflow, който говори за prepareForSegue малко повече (и малко по-подробно).

person Michael Dautermann    schedule 03.01.2012
comment
Всъщност това не променя стойността на string1 за постоянно. Искам да получа достъп до string1 от 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
Здравей SeungUn! Вече разгледах два проекта и се надявам, че съм ви помогнал достатъчно, за да можете да определите какъв ще бъде най-добрият курс на действие за вашето приложение. - person Michael Dautermann; 03.01.2012

сбърках последния път, когато опитах това.

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

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

person Community    schedule 04.01.2012