2013-07-08 2 views
1

У меня есть 3 контроллера вида A, B, C. Я хочу передать данные от A до C ... Я знаю, что мне нужно создать свойство в C и использовать его в А.Передача данных с одного контроллера представления на другой, дающий нуль

Но я не знаю, почему .. после установки значения в а я до сих пор получить нулевое значение в виде C ..

согласно данным предложениям я создал новый проект и новый код ... То, что я хочу достичь, просто из вида. Я хочу, чтобы значение передавалось в виде C..but в настоящее время оно дает нуль.

My view 1.h file ...

@interface ViewController : UIViewController 
- (IBAction)ActionButton:(id)sender; 

@end 

вид 1.m файл ..

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

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)ActionButton:(id)sender { 
    ViewController3 *v3 = [[ViewController3 alloc]init]; 
    v3.string = @"String"; 
// [self.view addSubview:v3.view]; 

    ViewController2 *v2 = [[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil ]; 
    [self.view addSubview:v2.view]; 
} 
@end 

Посмотреть 2.h файл ...

@interface ViewController2 : UIViewController 
- (IBAction)ActionButton:(id)sender; 
@property (nonatomic,retain) NSString *string1; 
@end 

Посмотреть 2.М файл

#import "ViewController2.h" 
#import "ViewController3.h" 

@interface ViewController2() 

@end 

@implementation ViewController2 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)ActionButton:(id)sender { 

    ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ]; 
    [self.view addSubview:v3.view]; 

} 
@end 

View 3 .h файл ..

@interface ViewController3 : UIViewController 

@property(nonatomic,retain) NSString *string; 

@end 

А Посмотреть 3.M файл ...

#import "ViewController3.h" 

@interface ViewController3() 

@end 

@implementation ViewController3 

@synthesize string; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    NSLog(@"%@",string); 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

FYI, если я удалить комментируемой код в view1 я получаю значение в представлении 3, но это меняет мою последовательность, я не хочу .. .

+0

Попробуйте изменить (сохранить, неатомно) NSString * WithdrawType; to (сильный, неатомный) NSString * WithdrawType; – Engnyl

+0

Неужели вы забыли «синтезировать» свою собственность в файле .m? – HRM

+0

Невозможно изменить свойство на сильное, не помогло ... И @HRM я синтезировал свойство в .m файле – Audi

ответ

3

Создание нового ответа, потому что измененный вопрос добавляет большей ясности в проблему.

В view1.m вы следующие

ViewController3 *v3 = [[ViewController3 alloc]init]; 
v3.string = @"String"; 

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

Тогда в view2.m вы

- (IBAction)ActionButton:(id)sender { 
    ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ]; 
    [self.view addSubview:v3.view]; 
} 

, который создает еще один новый экземпляр ViewController3 (на этот раз с макетом бобов), но вы не установите значение свойства.

Вы создали 2 разных экземпляра одного и того же объекта, но только установили значение свойства одного из них - тот, который вы не показываете.

Либо установите значение свойства ViewController3 в методе ActionButton для ViewController2, либо вам необходимо передать экземпляр ViewController3 в ViewController2, а затем добавить подвью из этого.

+0

Вот что я подумал ... но не очень правильно .... Это также означает, что нет способа передачи данных из view1 в view3 ??? – Audi

+1

Многое зависит от источника данных и архитектуры приложения. Для чего-то простого вы просто передадите данные с v1 на v2, а затем на v3. Если v1 является контроллером корневого представления в навигационном стеке, вы можете установить значение в свойстве на v1, а затем извлечь его экземпляр из v3, используя (ViewController1 *) [self.navigationController.viewControllers objectAtIndex: 0] и получить значение из свойства таким образом. –

+0

Спасибо, что многое помогает .. – Audi

0

Попробуйте напечатать это следующим образом:

NSLog(@"Type %@",self.WithdrawType); 

Если синтезировать вратаря, он будет синтезирован по умолчанию, как это:

@synthesize WithdrawType = _WithdrawType 

Так что вам нужно использовать самооборону. для доступа к установщику

Если нет, вы используете этот же контроллер?

Попробуйте также:

Denomination *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil]; 
+0

Да .... иначе это бы дало ошибку .. это не так? – Audi

+0

Можете ли вы поместить код, который используете? –

+0

Я только что отредактировал, попробую –

-2

Вы должны

@property (retain,nonatomic) NSString *WithdrawType; 

синтезирует это свойство в классе .m.

+0

downvoter, почему downvoting мне расскажу, в чем проблема ... – Jitendra

+0

Поскольку Xcode 4.4 синтезирование больше не требуется, но добавляется неявным компилятором llvm. – vikingosegundo

0

Звучит для меня как порядок выполнения проблемы. Если бы мне пришлось угадать метод - (id) viewDidLoad в контроллере C выполняется до deno.WithdrawType = @ "ATM"; в контроллере A.

Попробуйте установить некоторые точки останова или перенести инструкции NSLog из viewDidLoad в viewWillAppear, чтобы узнать, разрешает ли это это решение. Для решения вы, вероятно, можете создать метод initWithWithdrawType: (NSString *) removeType - (id) для инициализации вашего контроллера представлений и обеспечения контроля потока данных.

Будьте осторожны с тем, что viewDidLoad может запускаться, когда вы выполняете self = [super init] в своем новом методе, поэтому сначала задайте значение свойства.

+0

Даже если я использую то же самое с помощью события нажатия кнопки, строка по-прежнему равна нулю – Audi

+0

Хорошо, я думаю, что я вижу кое-что из того, что происходит здесь. Я собираюсь добавить новый ответ. –

Смежные вопросы