2015-03-11 2 views
0

У меня есть два ViewController (ViewController, ResultViewController).ios Навигация не может передать значение для следующего Viewcontroller, когда я снова popViewController

В окне ViewController есть три кнопки, и в ResultViewController есть кнопка возврата.

В ResultViewController я хочу получить значение из передачи ViewController.

Так что я добавить следующий код в ResultViewController

@interface ResultViewController : UIViewController 
- (IBAction)backEvent:(id)sender; 
@property (weak, nonatomic) IBOutlet UILabel *resultLb; 
@property (strong, nonatomic) NSString *selectedVal; 
@end 

.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.navigationController setNavigationBarHidden:YES animated:NO]; 
    self.resultLb.text = self.selectedVal; 

} 
- (IBAction)backEvent:(id)sender { 
    [self.navigationController popViewControllerAnimated:NO]; 
} 

В ViewController есть три кнопки действия:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.navigationController setNavigationBarHidden:YES animated:NO]; 
    rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"ResultViewController"]; 

} 
- (IBAction)passAEvent:(id)sender { 
    rvc.selectedVal = @"A"; 
    [self.navigationController pushViewController:rvc animated:NO]; 
} 

- (IBAction)passBEvent:(id)sender { 
    rvc.selectedVal = @"B"; 
    [self.navigationController pushViewController:rvc animated:NO]; 
} 

- (IBAction)passCEvent:(id)sender { 
    rvc.selectedVal = @"C"; 
    [self.navigationController pushViewController:rvc animated:NO]; 
} 

Когда я первый нажмите кнопку A, которая может скорректировать значение «A» в ResultViewController.

Но когда я нажимаю кнопку «Назад» в ResultViewController.

Затем нажмите действие кнопки B или C, которые все еще передают значение «A».

Я вижу журнал, который не входил в событие B, C.

Я пытаюсь запустить программу снова, когда я нажимаю первую кнопку с кнопкой B, правильно вводит и передает значение «B» в ResultViewController.

Но когда я нажимаю кнопку «Назад», затем нажмите кнопку «А» или «С», это неверное значение в ResultViewController. Оно все еще показывает значение «B».

Я не знаю почему? как я могу решить проблему, если не использовать делегат или уведомлять?

спасибо.

enter image description here

----- редактировать ----

К @Gaurav Singh

enter image description here

Я не найти вариант о неживой.

ответ

0

Это потому, что вы держите ссылку на UIViewController через свою переменную rvc.

Вы устанавливаете значение resultLb в методе viewDidLoad вашего контроллера. Когда вы нажимаете контроллер представления в стек, контроллер вашего представления устанавливает метку, беря то, что хранится в ее переменной selectedVal.

Когда вы выталкиваете контроллер вида из стека, потому что вы его сохранили в переменной, он не будет выгружен из памяти. Он все еще существует.Возможно, вы снова установите selectedVal, нажав вторую кнопку, однако viewDidLoad не будет снова запущен, так как он не будет повторно создан.

Что вы можете сделать, это перегрузка setSelectedVal на ResultViewController следующим образом:

- (void)setSelectedVal:(NSString *)selectedVal { 
    _selectedVal = selectedVal; 
    self.resultLb.text = selectedVal; 
} 

Таким образом, когда вы устанавливаете selectedVal от контроллера представления вызова, описанный выше метод будет работать, устанавливая стоимость вашего имущества в ResultViewController, а также изменение вашей метки.

EDIT - еще лучше:

Вместо того, чтобы установить значение метки в viewDidLoad:, сделайте это в viewWillAppear: вместо этого. Таким образом, вам не нужно переопределять какие-либо сеттеры или что-то в этом роде. Когда вызывается viewWillAppear, он будет читать строку, которую вы установили, и соответствующим образом настроить текст метки.

Надеюсь, это поможет!

+0

Спасибо, Джон Роджерс. Метод Ok ~ – dickfala

+0

Если вы нашли свое решение, отметьте правильный ответ. –

0

Вы просто делаете это сложным. Я хотел бы сделать это следующим образом:

  1. Сначала я соединюсь создать раскадровку SEGUE от ViewController Результата Controller (View Controller для просмотра контроллера Segue) и назначить подходящий идентификатор для этого Segue (скажем, «resultSegue»)

  2. то следующий код будет работать

    - (IBAction)passAEvent:(id)sender { 
        [self performSegueWithIdentifier:@"resultSegue" sender:@"A"]; 
    } 
    
    - (IBAction)passBEvent:(id)sender { 
        [self performSegueWithIdentifier:@"resultSegue" sender:@"B"]; 
    } 
    
    - (IBAction)passCEvent:(id)sender { 
        [self performSegueWithIdentifier:@"resultSegue" sender:@"C"]; 
    } 
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue 
         sender:(id)sender { 
         if([segue.identifier isEqualToString:@"resultSegue"]){ 
          ResultViewController *rvc = segue.destinationViewController; 
          rvc.selectedVal = sender; //Here SENDER will have value: A,B or C which we have passed in performSegueWithIdentifier:sender: method 
         } 
    } 
    

Edit: код в prepareForSegue: се NDER: Модифицированный метод, так что он проверяет идентификатор SEGUE перед началом работы на destinationViewController

+0

Я когда-либо использовал performSegueWithIdentifier, но когда я использую функцию performSegueWithIdentifier, я не могу настроить анимированную навигацию NO. Поэтому вместо этого я использую pushViewController. – dickfala

+0

Вы можете легко сделать это из раскадровки. Раньше был вариант с segue на раскадровке, который, если мы хотим, чтобы push был анимированным или нет –

+0

Извините, я не могу найти опцию animate в инспекторе в блоке Storyboard Segue. @@ – dickfala

0

поставил

rvc = [self.storyboard instantiateViewControllerWithIdentifier:@"ResultViewController"]; 

в viewWillAppear

0

Во-первых, вы должны дать SEGUE в "ID", как "resultSegue". Затем, используйте код:

- (void)prepareForSegue:(UIStoryboardSegue *)segue 
    sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"resultSegue"]){ 
     ResultViewController *rvc = segue.destinationViewController; 
     rvc.selectedVal.text = someUILabel.text; 
than use the [self.navigationController pushViewController:rvc animated:NO];//......... 
} 

Я дам вам более подробно, когда я м у себя дома, если вы не решить эту проблему .... спасибо!

+0

спасибо, @ Lanaya_HSIEH – dickfala

+0

XD ~~~~~ @ dickfala – Arco