【问题标题】:SWRevealViewController - manually switch to another view?SWRevealViewController - 手动切换到另一个视图?
【发布时间】:2014-02-01 11:54:30
【问题描述】:

我有一个用 SWRevealViewController 制作的侧边栏菜单。

侧边栏中的菜单元素之一是“登录”。它会打开登录视图(通过自定义 SWRevealViewController segue)。

我想在用户成功登录后以编程方式切换到另一个视图。我该怎么做?

更新,我的代码:

ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
SWRevealViewController *revealController = self.revealViewController;
[revealController setFrontViewController:vc animated:YES];

在此之后,我得到的只是空白屏幕。我究竟做错了什么?我觉得这是错误的:

ViewController *vc = [[ViewController alloc] init];

那么访问已加载的视图控制器的正确方法是什么? (它在应用启动时由 SWRevealViewController 作为前端控制器加载)

【问题讨论】:

  • 你能告诉我如何通过代码将 SWREvealview 控制器设置为根视图控制器...请

标签: ios objective-c


【解决方案1】:

使用 - (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;方法

SWRevealController 有它自己的属性,您可以从任何 UIViewController 访问:

SWRevealViewController *revealController = self.revealViewController;

您可以在其 GitHub 存储库中查看示例项目: https://github.com/John-Lluch/SWRevealViewController

【讨论】:

  • 谢谢!但是你能解释一下我如何从其他类访问这个方法吗? (我是 iOS 新手)我已经有 #import "SWRevealViewController.h" - 但是如何获取 SWRevealViewController 的当前实例来调用它的方法?
  • 你在启动时在哪里创建提到的控制器?
  • 您可以在库 GitHub 页面查看示例项目,我已经更新了我的答案
  • 兄弟@vburojevic你能帮帮我吗? stackoverflow.com/questions/42573338/… 。我最近两天累了。我仍然没有得到解决方案
【解决方案2】:

试试这个:

ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[vc] animated: YES];
// [navController pushViewController:vc animated:YES]; // use this if you want to stack the views
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];

【讨论】:

  • 你能告诉我如何通过代码将 SWREvealview 控制器设置为根视图控制器...请
  • 我没有以编程方式实现它,但它应该是这样的:使用- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController; 和“MenuViewController”作为后视图控制器和导航控制器作为前视图控制器。希望这会有所帮助
  • @benaneesh 我正在通过 presentViewController() 移动到视图控制器。在 viewDidLoad() 中,我正在实现这个方法,但总是在 self.revealViewController() 的 viewcontroller 中得到一个 nill 值。有什么想法吗??
  • presentViewController() 不使用当前的导航控制器,这就是你的问题。要么不以模态方式呈现它,要么弄清楚如何使用当前的导航控制器并以新的视图控制器作为前视图控制器以模态方式呈现它。
【解决方案3】:

试试这个:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[navController setViewControllers: @[rootViewController] animated: YES];

[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];

为我工作:-)

【讨论】:

  • 对于拥有不同故事板的人来说,这就是我的代码的样子(参考上面的代码): UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"OrderHistory" bundle:nil]; UINavigationController *navController = [storyboard instantiateInitialViewController]; [self.revealViewController setFrontViewController:navController]; [self.revealViewController setFrontViewPosition:FrontViewPositionLeft 动画:YES];
  • 每次调用mainviewcontroller方法的方法在frontview的子视图上,即使它们之间没有任何导航,谁能帮助我? :(
【解决方案4】:

有一个新的 API - (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;

据我所知,这是手动在视图控制器之间正确切换动画的最优雅的方式。

// get the view controller you want to push to properly.
// in this case, I get it from Main.storyboard
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController * vc = [sb instantiateViewControllerWithIdentifier:@"SignInViewController"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];

[navController setViewControllers: @[vc] animated:NO];
[self.revealViewController pushFrontViewController:navController animated:YES];

如果您在不导入SWRevealViewController 的目标vc 中并想推回:

// get your vc properly
[self.navigationController setViewControllers:@[vc] animated:YES];

请注意[self.navigationController showViewController:vc sender:self]; 的结果相同,但不要使用它,因为这会在导航堆栈上创建一个新的视图控制器,这在使用SWRevealViewController 时基本上没有意义。

【讨论】:

【解决方案5】:

这个很适合我

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];

UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
[navController setViewControllers: @[rootViewController] animated: YES];

[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];

【讨论】:

  • 我正在通过 presentViewController() 移动到视图控制器。在 viewDidLoad() 中,我正在实现这个方法,但总是在 self.revealViewController() 的 viewcontroller 中得到一个 nill 值。有什么想法吗??
  • 你能看看我的这个问题stackoverflow.com/q/35699581/5395919。我在这个问题上很挣扎。
【解决方案6】:

这里是 setFrontViewController 解决方案的 Swift 版本:

if let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SecondViewControllerStoryBoardID") as? SecondViewController {
  let navController = UINavigationController(rootViewController: secondViewController)
  navController.setViewControllers([secondViewController], animated:true)
  self.revealViewController().setFrontViewController(navController, animated: true)
} 

【讨论】:

    【解决方案7】:

    @Evana 有一个很好的答案,但是对于我将参数传递给 destViewController 的情况,我需要改进它,如下所示。通过完全按照她的示例,我注意到 DestViewController viewDidLoad 被调用了两次。首先在'selectedId'上使用0,只有第二次调用'selectedId'正在接收我的标签值。

    因此,为了更干净的导航,必须从navController中获取DestViewController,这样就没有多余的调用了。

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    
    UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"DestNavController"];
    
    DestViewController *destViewController = (DestViewController*)[[navController viewControllers] objectAtIndex:0];
    
    destViewController.selectedId = ((UIButton*)sender).tag;
    
    [self.revealViewController setFrontViewController:navController];
    

    【讨论】:

    猜你喜欢
    • 2015-05-09
    • 2011-04-13
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多