Ios 以编程方式设置/激活Segue
我正在尝试在iOS应用程序中设置首次启动视图。为了做到这一点,我有以下代码,允许我在应用程序第一次启动时执行代码 我想要的是,当应用程序第一次启动时,用户被发送到我在故事板中设置的FirstLaunch视图,而不是FirstView视图。每次连续启动都会将用户发送到FirstLaunch视图 目前,我在Ios 以编程方式设置/激活Segue,ios,objective-c,xcode-storyboard,Ios,Objective C,Xcode Storyboard,我正在尝试在iOS应用程序中设置首次启动视图。为了做到这一点,我有以下代码,允许我在应用程序第一次启动时执行代码 我想要的是,当应用程序第一次启动时,用户被发送到我在故事板中设置的FirstLaunch视图,而不是FirstView视图。每次连续启动都会将用户发送到FirstLaunch视图 目前,我在NavigationController.m中执行此代码,但是如果在AppDelegate.m中执行更好,我可以更改它 if ([[NSUserDefaults standardUserDefau
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当应用程序崩溃时,您会遇到什么错误?您是否在一个没有其他部分可能崩溃的小项目上尝试这种方法?