#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)