2014-03-04 6 views
3

У меня есть два ViewControllers, которые aren`t (напрямую) связаны с Segue. Но я хочу изменить String во втором VC, который я получаю в первом. Моя попытка была:Получить ViewController из раскадровки

#import "secondViewController.h" 

    @interface firstViewController() 
    @property NSString* originalString; 
    @end 

    @implementation firstViewController 

    -(void)viewDidDisappear:(BOOL)animated{ 
     [super viewDidDisappear:animated]; 
     secondViewController* svc = [secondViewController new]; 
     svc.anotherString = self.originalString;  
    } 

Но работы доцента, потому что я только создал экземпляр второго ОК, так что значение не было сохранено. Также я не могу использовать идентификатор раскадровки, потому что я использую Xcode 5.

У меня есть menuVC, из которого вы можете перейти к firstVC и secondVC. И с первого VC я могу вернуться (с навигационной панелью) в меню. так: menu-> firstVC->. меню-> secondVC -> ...-> Меню

Моя попытка с StoryboardID:

-(void)viewDidDisappear:(BOOL)animated{ 
     [super viewDidDisappear:animated]; 

     secondViewController* svc =[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"secondVCSrorybradID"]; 

     svc.anotherString = self.originalString;  
    } 
+0

Как вы получаете от первого до второго VC? – rdurand

+0

? почему вы не можете использовать идентификатор раскадровки ??? – Ilario

+0

Вы спрашиваете, почему originalString не обновляется при изменении svc.anotherString? – iain

ответ

2

Вы должны передать данные последовательно через ваш UIViewController сек навигации. Если, например, у вас есть навигация, как FirstVC > SecondVC > ThirdVC:

В вашем FirstVC.m, используйте:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    ((SecondVCClass*) segue.destinationViewController).secondVCString = _firstVCString; 
} 

С secondVCString будучи @property в вашем втором ViewController.

В вашем SecondVC.m используйте:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    ((ThirdVCClass*) segue.destinationViewController).thirdVCString = _secondVCString; 
} 

С конечно thirdVCString будучи @property в вашем третьем ViewController.


Edit:

Как вы обновили свой вопрос, вот что я предлагаю:

  • В вашем MenuVC, добавьте это:

    @property (nonatomic, weak) NSString *importantString; 
    
  • В ваш FirstVC и SecondVC, добавьте это:

    @property (nonatomic, weak) MenuVCClass *menu; 
    
  • Когда вы нажимаете на FirstVC или SecondVC, используйте prepareForSegue, чтобы установить вид контроллер пункта назначения menu свойство в меню:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        if ([segue.identifier isEqualToString:@"FirstSegue"]) 
         ((FirstVC*) segue.destinationViewController).menu = self; 
        else if ([segue.identifier isEqualToString:@"SecondSegue"]) 
         ((SecondVC*) segue.destinationViewController).menu = self; 
    } 
    
  • В FirstVC или SecondVC, вы можете изменить значение NSString из ваше меню с помощью _menu.importantString = @"";

+0

спасибо, но моя первая и моя секция на VC идет как из другого VC, поэтому, когда я вернусь в свое меню, метод «prepareForSegue» не будет вызван. – Sam

+0

Можете ли вы отредактировать свой вопрос со структурой вашего приложения? Что-то вроде FirstVC - SecondVC - и т. Д. – rdurand

+0

@ user3343292: Я обновил свой ответ – rdurand

1

Вы никогда не должны использовать new для создания вида гр ontroller.

Если вы используете раскадровки, но не используете segues, вы все равно можете создать контроллер вида из раскадровки и вызвать его.

Используйте метод instantiateViewControllerWithIdentifier:, чтобы создать экземпляр контроллера целевого представления.Задайте свойства, которые вы хотите установить, и, наконец, сделайте вызов, чтобы отобразить его (покажите его в текстовом режиме, нажмите его в стек навигации или все, что подходит для вашей программы.)

+0

спасибо, но, как я уже сказал, я не могу использовать Starboard ID – Sam

+0

Нельзя использовать идентификатор раскадровки, который вы имеете в виду? Зачем? Вы сказали «потому что я использую Xcode 5», что не имеет никакого смысла. –

+0

, но у меня нет идентификатора storryboard, на самом деле ... У меня есть только заголовок – Sam

11

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

secondViewController* svc =[self.storyboard instantiateViewControllerWithIdentifier:@"Your Second VC's Storyboad ID"]; 
svc.anotherString = self.originalString;  
[self presentViewController:svc animated:YES completion:nil]; 

// вам нужно создать свойство anotherString в файле .h файла View Viewer.

Теперь вы можете получить строку originalString для второго VC. Теперь вы можете получить это значение обратно второй VC для первого VC.

надеюсь, что это вам поможет.

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