как вызвать view controller программно?

<p>я посмотрел все учебники, которые я могу найти на этом, и у меня до сих пор нет ответа. мне нужно вызвать другой вид из кода. я использую <code>uistoryboards</code>. я много раз менял представление путем перетаскивания элемента управления из <code>uibuttons</code>, но теперь оно должно быть из кода. я пытаюсь вызвать информационную страницу из главного меню, если пользователь впервые открыл приложение. однако я не могу найти способ изменить взгляды из кода. все мои представления контролируются одними и теми же файлами (<strong> viewcontroller2 </strong>). <code>identifier</code> моего главного меню -<strong> viewcontrollermain </strong>, а <code>identifier</code> информационной страницы -<strong> viewcontrollerinfo </strong>. сначала я попробовал это:</p><pre><code>[viewcontrollermain presentviewcontroller: viewcontrollerinfo animated:yes completion: null]; </code></pre><p>затем я попытался создать разные <code>uiviewcontrollers</code> для каждого и сказать:</p><pre><code>[viewcontroller2 presentviewcontroller: viewcontroller animated:yes completion: null]; </code></pre><p>ни один не работал. для первого он говорит:</p><blockquote> <p>использование необъявленного идентификатора viewcontrollermain.</p> </blockquote><p>во втором говорится:</p><blockquote> <p>неожиданное имя интерфейса 'viewcontroller': ожидаемый идентификатор.</p> </blockquote><p>что я могу сделать?</p>

<p>чтобы создать контроллер представления:</p><pre><code>uiviewcontroller * vc = [[uiviewcontroller alloc] init]; </code></pre><p>для вызова контроллера представления (должен вызываться из другого viewcontroller):</p><pre><code>[self presentviewcontroller:vc animated:yes completion:nil]; </code></pre><p>например, используйте ноль, а не ноль.</p><hr><p>загрузка контроллера представления из раскадровки:</p><pre><code>nsstring * storyboardname = @"mainstoryboard"; uistoryboard *storyboard = [uistoryboard storyboardwithname:storyboardname bundle: nil]; uiviewcontroller * vc = [storyboard instantiateviewcontrollerwithidentifier:@"identifier\_of\_your\_viewcontroller"]; [self presentviewcontroller:vc animated:yes completion:nil]; </code></pre><p><code>identifier</code> вашего контроллера представления совпадает либо с именем класса вашего контроллера представления, либо с идентификатором раскадровки, который вы можете назначить в инспекторе идентификации вашей раскадровки.</p>

<p>вам нужно создать экземпляр контроллера представления из раскадровки и затем показать его:</p><pre><code>viewcontrollerinfo* infocontroller = [self.storyboard instantiateviewcontrollerwithidentifier:@"viewcontrollerinfo"]; [self.navigationcontroller pushviewcontroller:infocontroller animated:yes]; </code></pre><p>в этом примере предполагается, что у вас есть контроллер навигации, чтобы вернуться к предыдущему виду. конечно, вы также можете использовать presentviewcontroller: animated: завершение :. главное, чтобы ваша раскадровка создала экземпляр вашего целевого контроллера представления, используя идентификатор целевого контроллера представления.</p>

<h1>стриж</h1><p>это получает контроллер представления из раскадровки и представляет его.</p><pre><code>let storyboard = uistoryboard(name: "main", bundle: nil) let secondviewcontroller = storyboard.instantiateviewcontroller(withidentifier: "secondviewcontrollerid") as! secondviewcontroller self.present(secondviewcontroller, animated: true, completion: nil) </code></pre><p>измените имя раскадровки, просмотр имени контроллера и просмотр идентификатора контроллера в зависимости от ситуации.</p>

<p>вы можете вызвать viewcontroller таким образом, если вы хотите с navigationcontroller</p><p><img src="https://i.stack.imgur.com/grkow.png" alt="enter image description here"></p><p><strong> 1. на текущем экране: загрузить новый экран </strong></p><pre><code>verifyexpviewcontroller *addprojectviewcontroller = [[verifyexpviewcontroller alloc] init]; [self.navigationcontroller pushviewcontroller:addprojectviewcontroller animated:yes]; </code></pre><p><strong> 2.1 в режиме загрузки: добавьте ниже в .h файл </strong></p><pre><code>@interface verifyexpviewcontroller : uiviewcontroller <uinavigationcontrollerdelegate> </code></pre><p><strong> 2.2 в loaded view: добавить ниже в .m файл </strong></p><pre><code> @implementation verifyexpviewcontroller - (void)viewdidload { [super viewdidload]; self.navigationcontroller.delegate = self; [self setnavigationbar]; } -(void)setnavigationbar { self.navigationcontroller.navigationbar.backgroundcolor = [uicolor clearcolor]; self.navigationcontroller.navigationbar.translucent = yes; [self.navigationcontroller.navigationbar setbackgroundimage:[uiimage imagenamed:@"b\_topbar.png"] forbarmetrics:uibarmetricsdefault]; self.navigationcontroller.navigationbar.titletextattributes = @{nsforegroundcolorattributename: [uicolor whitecolor]}; self.navigationitem.hidesbackbutton = yes; self.navigationitem.leftbarbuttonitem = [[uibarbuttonitem alloc] initwithimage:[uiimage imagenamed:@"btn\_topback.png"] style:uibarbuttonitemstyleplain target:self action:@selector(onbackbuttontap:)]; self.navigationitem.leftbarbuttonitem.tintcolor = [uicolor lightgraycolor]; self.navigationitem.rightbarbuttonitem = [[uibarbuttonitem alloc] initwithimage:[uiimage imagenamed:@"save.png"] style:uibarbuttonitemstyleplain target:self action:@selector(onsavebuttontap:)]; self.navigationitem.rightbarbuttonitem.tintcolor = [uicolor lightgraycolor]; } -(void)onbackbuttontap:(id)sender { [self.navigationcontroller popviewcontrolleranimated:yes]; } -(ibaction)onsavebuttontap:(id)sender { //todo for save button } @end </code></pre><p>надеюсь, что это будет полезно для кого-то там :)</p>

<p>есть 2 способа сделать это:</p><p>1. создайте переход к вашему viewcontroller в раскадровке, как описано в моем ответе здесь: <a href="https://stackoverflow.com/questions/7964712/how-to-perform-a-segue-that-is-not-related-to-user-input-in-ios-5/8452602#8452602">как выполнить переход, не связанный с пользовательским вводом в ios 5?</a> </p><p>2. дайте свой viewcontroller и идентификатор и назовите его, используя код в моем ответе здесь: <a href="https://stackoverflow.com/questions/10522957/call-storyboard-scene-programmatically-without-needing-segue/10523076#10523076">вызовите сцену раскадровки программно (без необходимости перехода)?</a> </p>

<p>основная логика этого is\_,</p><pre><code>nsstring * storyboardidentifier = @"secondstoryboard"; uistoryboard *storyboard = [uistoryboard storyboardwithname:storyboardidentifier bundle: nil]; uiviewcontroller * uivc = [storyboard instantiateviewcontrollerwithidentifier:@"yourviewcontrolleridentifer"]; [self presentviewcontroller:uivc animated:yes completion:nil]; </code></pre>

<pre><code> uistoryboard* storyboard = [uistoryboard storyboardwithname:@"mainstoryboard\_iphone\_ios7" bundle:nil]; accountviewcontroller * controller = [storyboard instantiateviewcontrollerwithidentifier:@"accountview"]; // [self presentviewcontroller:controller animated:yes completion:nil]; uiviewcontroller *toprootviewcontroller = [uiapplication sharedapplication].keywindow.rootviewcontroller; while (toprootviewcontroller.presentedviewcontroller) { toprootviewcontroller = toprootviewcontroller.presentedviewcontroller; } [toprootviewcontroller presentviewcontroller:controller animated:yes completion:nil]; </code></pre>

<p>импортируйте класс контроллера представления, который вы хотите показать, и используйте следующий код</p><pre><code>kartviewcontroller *viewkart = [[kartviewcontroller alloc]initwithnibname:@"kartviewcontroller" bundle:nil]; [self presentviewcontroller:viewkart animated:yes completion:nil]; </code></pre>