簡體   English   中英

以編程方式調用故事板場景(不需要segue)?

[英]Call storyboard scene programmatically (without needing segue)?

我有一個模態故事板場景,我希望所有其他場景都可以訪問。 從我的故事板上的每個場景創建一個模態segue會產生一大堆亂七八糟的字符串。 有沒有辦法讓我離開segues並以編程方式調用場景?

基本上我想做這樣的事情:

  MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
  [self presentModalViewController:myNewVC animated:YES];

除了創建和推送視圖控制器類,我想做一個模態轉換到“隔離”(不與segue連接)故事板場景。

是的你可以。 做這樣的事情來訪問VC,然后只是模態推送它:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];

注意:方法presentModalViewController:animated在iOS 6中已棄用。

新代碼應為:

NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[self presentViewController:controller animated:YES completion:nil];

在故事板中為視圖控制器提供一個標識符(在Attributes Inspector下),然后使用以下代碼將該視圖轉發。

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];

我有一個案例,我想從應用程序的主要部分呈現視圖控制器,一個具有設置和幫助等。 要做到這一點,我希望它在一個導航控制器中,我們可以從UIBarButtonItem調用一個小插件模塊。

現在,這可以在當前的故事板中,或者在另一個故事板中,也沒關系。

我想這樣做,因為我厭惡我的故事板上的segue line spaghetti的潛力。

這是怎么做的。

- (IBAction)displaySettings:(id)sender
{
    LOG_SELECTOR() // google that for extra goodness

    // FYI, this can be done using a different storyboard like so.
    /*
     NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
     UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
     */

    // To push a new set of scenes with a new Navigation Controller, it is done like this:
    UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
    OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
    [settingsNC pushViewController:settingsVC animated:NO];

    [settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

    // Present the view controller;
    [self presentViewController:settingsNC animated:YES completion:NULL];
}

在呈現的視圖控制器中(或在導航控制器的子類中),您可以使用UIBarButtonItem來關閉整個呈現的視圖控制器層次結構,如下所示:

- (IBAction)dismissThisVC:(id)sender {
     [self dismissViewControllerAnimated:YES completion:nil];
}

希望這可以幫助一群人。 干杯。

這是一個Swift版本:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myVC = storyboard.instantiateViewControllerWithIdentifier("myStoryId")
self.presentViewController(myVC, animated: true, completion: nil)

您還應該像這樣更改您的故事板ID: 在此輸入圖像描述

打電話導航到其他課程

UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

UINavigationController *navController = (UINavigationController *)window.rootViewController;

DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];

dump.isPushed=YES;

dump.strUserId = appDelegate.strFriendid;


[navController pushViewController:dump animated:YES];

在此輸入圖像描述 只需使用導航控制器調用viewcontroller在viewcontroller中編寫此代碼,並在storyboad中設置viewcontroller,如圖所示。

ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
        [self.navigationController pushViewController:vc animated:YES];

我認為通過iOS7,通過故事板實現它變得非常容易

我目前正在學習iOS7中的新功能並找到了這個簡單的解決方案,但即使在以前的版本中它也可能是相關的,我不確定。

首先,您需要將呈現VC與目標VC連接(這是唯一需要的連接),然后在故事板的屬性檢查器中選擇要模態的樣式,在身份檢查器中為VC提供storyboardID並確保檢查'使用storyboardID'復選框,

如果還沒有將此方法添加到您的presentationVC:

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

   YourTargetVC * targetVC = 
         (YourTargetVC *)segue.destinationViewController;

   if(nil != targetVC) {

       //Do preparations here
   }

}

現在,當您希望從presentationVC展示您的targetVC時,您可以使用:

[self performSegueWithIdentifier:(NSString *) sender:(id)];

其中標識符是viewController的storyboardID,發送方是觸發操作的視圖,此方法將調用storyboard場景,因此將調用[prepareForSegue: sender:]方法,允許您在targetViewController出現之前進行最后修改。

Heres Swift 3版本:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM