在没有 segue 的情况下在 2 个视图之间传递数据

Pass data between 2 views without segues

我有 2 个视图,一个登录视图和一个主视图。

我使用 SWRevealViewController,我想在应用程序启动时自动显示我的菜单。我知道如何显示我的菜单,但我不知道如何在启动时只显示一次。

我想在我的登录视图和我的主视图之间传递一个简单的字符串,但没有 segue,并做了一个简单的测试:

 if (myPreviousView == "LoginView")
 {
      // display my menu
 }

您可以修改第二个视图控制器的 init 方法,以便在子class 时采用自定义属性。因此,假设您创建了一个标准的 UIViewController(.h 和 .m 文件)。您可以在 .h 文件中根据自己的喜好修改此新 class 的 init 方法:

- (instancetype)initWithString:(NSString *)string;

然后用.m中的新的替换标准的init:

- (instancetype)initWithString:(NSString *)string {
}

因此,当您调用视图控制器时,您只需使用这个新的 init 方法并像这样传递您想要的字符串:

UIViewController *viewController    = [[UIViewController alloc] initWithString:myString];
[self presentViewController:viewController animated:NO completion:nil];

这当然是一种编程方法,但它应该很容易应用于界面生成器(不幸的是,因为我从未使用过界面生成器,所以我不知道具体如何,但正如我所说,它应该相当简单给任何使用它的人)。

另一种方法是使用 NSUserDefault 来存储您的字符串,然后可以从应用程序中的任何地方访问它。

因此,您在第一个视图中将字符串放入 NSUserDefaults 中:

// Initialize the NSUserDefaults object and an array for data storage
NSUserDefaults *defsData = [NSUserDefaults standardUserDefaults];
NSMutableArray *myArray = [[NSMutableArray alloc] init];

// Add your string to the custom array
NSString *myString = @"My string.";
[myArray addObject:myString];

// Put the array back into UserDefaults for later use
[defsData setObject:myArray forKey:@"Key"]; // Key can be anything
[defsData synchronize];

现在,数组(以及其中的字符串)随处可用。因此,当您导航到第二个视图控制器时,只需初始化一个 NSUserDefaults 并访问字符串:

NSUserDefaults* defsData = [NSUserDefaults standardUserDefaults];
NSArray *myArray = [defsData objectForKey:@"Key"];

NSLog("This is my stored string: %@", [myArray objectAtIndex:0]);