Как передать значение ViewController, встроенному в NavigationController

#ios #objective-c #uinavigationcontroller #storyboard

#iOS #цель-c #uinavigationcontroller #раскадровка

Вопрос:

Есть похожие вопросы, но они либо в swift, либо не решают мою проблему.
У меня есть контроллер представления, который представляет контроллер представления навигации, когда кнопка выбора ячейки нажата как:

 patientBillNavigationViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PatientBillVC"];
//soem value assignment
[self presentViewController:viewController animated:YES completion:nil];
 

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

Представление, которое автоматически загружает этот контроллер представления навигации, — это представление счета, и теперь, если я хочу передать значение из этого viewcontroller в другой ViewController, встроенный в представление навигации, я не могу этого сделать. Как передать значение?

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
            PatientBillViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PBVC"];

            vc.superBillToAddEdit = sb;
//then display the view embedded in navigation view
 

Но это не работает.

Комментарии:

1. почему вы не используете delegate protocol для этого? Установите контроллер представления в качестве делегата вашего PatientBillViewController , прежде чем представлять его.

Ответ №1:

Один из способов, который я знаю, — это подкласс UINavigationViewController , и в нем viewDidLoad вы можете сделать:

  YourEmbeddedVc *svc =self.viewControllers[0]; //get the controller reference
 svc.name= @"Hello";
 

Я предполагаю, что у вас есть только один контроллер в вашем навигационном стеке, если нет, вам нужно найти правильное соответствие требуемому VC.

Ответ №2:

Возможно, я не совсем понимаю вопрос, поправьте меня, если я ошибаюсь.

Похоже, вы хотите запустить навигационный контроллер из контроллера представления (назовем это firstViewController так) и передать значение из firstViewController контроллера представления, которое в конечном итоге загрузится в навигационный контроллер.

Если это так, почему бы вам не создать второй view controller ( billingStep1ViewController ), а затем присвоить ему значение в качестве свойства, а затем передать billingStep1ViewController методу контроллера навигации initWithRootViewController: ?

Что-то вроде этого (непроверенный код, кстати):

 // this code would go inside our FirstViewController file
// create the first vc that will be loaded in the nav controller
BillingStep1ViewController *billingStepOneVc = [self.storyboard instantiateViewControllerWithIdentifier:@"stepOne"];
// set the value you want
billingStepOneVc.bill = myBill;
// create new nav controller with step one vc as the root
UINavigationController *uiNavController = [[UINavigationController alloc] initWithRootViewController:billingStepOneVc];
[self presentViewController:uiNavController];
 

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

Обновление: Вот несколько проверенных кодов, которые работают, чтобы проиллюстрировать мою идею:

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//create the step 1 view controller - this is the first view controller we will see in the navigation controller
StepOneViewController *stepOneVc = [storyboard instantiateViewControllerWithIdentifier:@"stepOne"];
//assign a value to it (name is an NSString @property of StepOneViewController)
stepOneVc.name = @"Jones";

//this is the nav controller we will display, we set the root vc to our step one.
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:stepOneVc];

//present the nav controller on screen.
[self presentViewController:navController animated:YES completion:nil];
 

Некоторые имена классов изменились, но идея осталась той же.

Ответ №3:

Вместо того чтобы создавать контроллер навигации на основе его идентификатора раскадровки, создайте его программно, PatientBillViewController используя созданный вами в качестве корневого контроллера представления. Вот так:

 UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

PatientBillViewController *pbVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"PBVC"];
pbVC.superBillToAddEdit = sb;

PatientBillNavigationViewController * navVC = [[PatientBillNavigationViewController alloc] initWithRootViewController:pbVC];

[self presentViewController:navVC animated:true completion:nil];
 

Ответ №4:

Быстрая версия

Вот быстрый вариант ответа на вышеуказанную проблему!!

    let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PatientBillVC") as! patientBillNavigationViewController
   vc.name = "name"
   let mVc = UINavigationController.init(rootViewController: vc)
       self.navigationController?.present(mVc, animated: true, completion: nil)