Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式设置/激活Segue_Ios_Objective C_Xcode Storyboard - Fatal编程技术网

Ios 以编程方式设置/激活Segue

Ios 以编程方式设置/激活Segue,ios,objective-c,xcode-storyboard,Ios,Objective C,Xcode Storyboard,我正在尝试在iOS应用程序中设置首次启动视图。为了做到这一点,我有以下代码,允许我在应用程序第一次启动时执行代码 我想要的是,当应用程序第一次启动时,用户被发送到我在故事板中设置的FirstLaunch视图,而不是FirstView视图。每次连续启动都会将用户发送到FirstLaunch视图 目前,我在NavigationController.m中执行此代码,但是如果在AppDelegate.m中执行更好,我可以更改它 if ([[NSUserDefaults standardUserDefau

我正在尝试在iOS应用程序中设置首次启动视图。为了做到这一点,我有以下代码,允许我在应用程序第一次启动时执行代码

我想要的是,当应用程序第一次启动时,用户被发送到我在故事板中设置的FirstLaunch视图,而不是FirstView视图。每次连续启动都会将用户发送到FirstLaunch视图

目前,我在
NavigationController.m
中执行此代码,但是如果在
AppDelegate.m
中执行更好,我可以更改它

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLaunch"])
{
    // not first launch
}
else
{
    // first launch

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstLaunch"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

我的问题是:如何以编程方式设置segue(或激活segue)以将用户发送到FirstLaunch视图而不是普通的FirstView?

在故事板中为您需要的segue设置标识符(选择segue并选择属性检查器)

之后,您可以通过编程方式调用该segue:

[self performSegueWithIdentifier:@"indentifier" sender:nil];

这篇关于segue的解释很好的文章将回答您的问题

使用segue激活和传递数据的示例块:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showRecipeDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        RecipeDetailViewController *destViewController = segue.destinationViewController;
        destViewController.recipeName = [recipes objectAtIndex:indexPath.row];
    }
}

和将是很好的参考。

您不需要一个序列来实现这一点-您所需要的只是一种方法,根据是否是第一次启动,以编程方式选择初始视图控制器

要执行此操作,请取消选中
FirstView
上故事板中的“is initial view controller”,并按如下方式更改应用程序代理:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
    // Use the name of your storyboard below
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
    NSString *initialId;
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLaunch"]) {
        // not first launch
        initialId = @"FirstViewController";
    } else {
        // first launch
        initialId = @"FirstLaunchViewController";    
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:initialId];
    [self.window makeKeyAndVisible];
    return YES;
}
上面的代码嵌入了决定这是否是首次启动的代码,并基于此决定设置目标屏幕的情节提要标识符


请注意,此实现将不会再次向用户显示第一次启动屏幕,即使用户在第一次显示屏幕时没有机会仔细查看(例如,因为有人打电话给他,或者设备的电池电量耗尽)。更好的方法是以与您相同的方式读取
NSUserDefaults
,但仅当用户解除第一个启动控制器时才将其设置为
YES
。通过这种方式,您可以确定用户有足够的时间查看屏幕并与之交互。

对于情节提要的名称:我有一个名为
Main的情节提要。情节提要
,我是否也应该插入前缀(.storyboard)?另外,对于
//not first launch
,即使我已经将初始视图控制器设置为故事板中的默认视图,也有必要将其设置为
FirstViewController
。@James为了让这个技巧起作用,您需要将
FirstViewController
设置为故事板中的默认视图。您没有将
.storyboard
传递给名为:方法的
storyboard-只应传递
@“Main”
。@dasklinkenlight即使只要求将此代码发送到
FirstLaunchViewController
来测试此代码,它也会崩溃;以及正常的
FirstViewController
视图-虽然它可能与我当前用于项目的设置有关。@James当应用程序崩溃时,您会遇到什么错误?您是否在一个没有其他部分可能崩溃的小项目上尝试这种方法?