`enum` 类型在将它作为参数从一个 viewController 传递给另一个时总是得到 `0`
`enum` type always getting `0` while passing it as parameter from one viewController to another
这是我的 enum
:
typedef enum {
ViewControllerNameSignUpViewController,
ViewControllerNameForgotPasswordViewController,
ViewControllerNameProfileViewController,
} ViewControllerName;
我想从我的 LeftMenuViewController
发送 ViewControllerName
到 HomeViewController
LeftMenuViewController
代码:
HomeViewController *controller = [HomeViewController initViewControllerWithFurtherNavigationFor:ViewControllerNameProfileViewController];
UINavigationController *navController = (UINavigationController *)self.revealViewController.frontViewController;
[navController setViewControllers:@[controller] animated:NO];
[self.revealViewController setFrontViewPosition:FrontViewPositionLeft animated:YES];
HomeViewController
代码:
@property (assign, nonatomic) ViewControllerName viewControllerName;
.
+ (instancetype)initViewControllerWithFurtherNavigationFor:(ViewControllerName)viewControllerName
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
HomeViewController *controller = [storyboard instantiateViewControllerWithIdentifier:kHomeViewControllerID];
if (controller) {
controller.viewControllerName = viewControllerName;
}
return controller;
}
这里controller.viewControllerName
是完美获取参数,即2
。但是当我从 viewDidLoad
检查它时,它总是得到 0
:
- (void)viewDidLoad {
[super viewDidLoad];
[self leftMenuButtonInitialization];
[self initialViewSetUp];
[self furtherNavigation];
}
.
- (void)furtherNavigation
{
if (self.viewControllerName == ViewControllerNameProfileViewController) {
ProfileViewController *controller = [ProfileViewController initViewController];
[controller presentViewController:controller animated:YES completion:nil];
}
}
这里,self.viewControllerName
总是0
。当我在 initViewController
中设置值时,我不是可以通过 class 访问它作为 self.viewControllerName
吗?或者我遗漏了什么?
非常感谢。
经过 1 小时的挖掘,我找到了替代方案。问题可能在于 initViewControllerWithFurtherNavigationFor
.
的调用方法
我在 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
和 ([[segue identifier] isEqualToString:@"goToProfileViewController"])
中使用 segue 调用了那个方法。所以我不必再 instantiateViewControllerWithIdentifier
了。我可以简单介绍为destinationViewController
。然后可以传递任何关联的参数。因此,不要使用此代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"goToProfileViewController"]) {
HomeViewController *controller = [HomeViewController initViewControllerWithFurtherNavigationFor:ViewControllerNameProfileViewController];
UINavigationController *navController = (UINavigationController *)self.revealViewController.frontViewController;
[navController setViewControllers:@[controller] animated:NO];
[self.revealViewController setFrontViewPosition:FrontViewPositionLeft animated:YES];
}
}
使用这个:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"goToProfileViewController"]) {
HomeViewController *controller = [segue destinationViewController];
controller.viewControllerName = ViewControllerNameProfileViewController;
}
}
希望对这类问题有所帮助。 :)
这是我的 enum
:
typedef enum {
ViewControllerNameSignUpViewController,
ViewControllerNameForgotPasswordViewController,
ViewControllerNameProfileViewController,
} ViewControllerName;
我想从我的 LeftMenuViewController
发送 ViewControllerName
到 HomeViewController
LeftMenuViewController
代码:
HomeViewController *controller = [HomeViewController initViewControllerWithFurtherNavigationFor:ViewControllerNameProfileViewController];
UINavigationController *navController = (UINavigationController *)self.revealViewController.frontViewController;
[navController setViewControllers:@[controller] animated:NO];
[self.revealViewController setFrontViewPosition:FrontViewPositionLeft animated:YES];
HomeViewController
代码:
@property (assign, nonatomic) ViewControllerName viewControllerName;
.
+ (instancetype)initViewControllerWithFurtherNavigationFor:(ViewControllerName)viewControllerName
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
HomeViewController *controller = [storyboard instantiateViewControllerWithIdentifier:kHomeViewControllerID];
if (controller) {
controller.viewControllerName = viewControllerName;
}
return controller;
}
这里controller.viewControllerName
是完美获取参数,即2
。但是当我从 viewDidLoad
检查它时,它总是得到 0
:
- (void)viewDidLoad {
[super viewDidLoad];
[self leftMenuButtonInitialization];
[self initialViewSetUp];
[self furtherNavigation];
}
.
- (void)furtherNavigation
{
if (self.viewControllerName == ViewControllerNameProfileViewController) {
ProfileViewController *controller = [ProfileViewController initViewController];
[controller presentViewController:controller animated:YES completion:nil];
}
}
这里,self.viewControllerName
总是0
。当我在 initViewController
中设置值时,我不是可以通过 class 访问它作为 self.viewControllerName
吗?或者我遗漏了什么?
非常感谢。
经过 1 小时的挖掘,我找到了替代方案。问题可能在于 initViewControllerWithFurtherNavigationFor
.
我在 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
和 ([[segue identifier] isEqualToString:@"goToProfileViewController"])
中使用 segue 调用了那个方法。所以我不必再 instantiateViewControllerWithIdentifier
了。我可以简单介绍为destinationViewController
。然后可以传递任何关联的参数。因此,不要使用此代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"goToProfileViewController"]) {
HomeViewController *controller = [HomeViewController initViewControllerWithFurtherNavigationFor:ViewControllerNameProfileViewController];
UINavigationController *navController = (UINavigationController *)self.revealViewController.frontViewController;
[navController setViewControllers:@[controller] animated:NO];
[self.revealViewController setFrontViewPosition:FrontViewPositionLeft animated:YES];
}
}
使用这个:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"goToProfileViewController"]) {
HomeViewController *controller = [segue destinationViewController];
controller.viewControllerName = ViewControllerNameProfileViewController;
}
}
希望对这类问题有所帮助。 :)