如何在 ios 的 swreveal 视图控制器中推送弹出窗口?

Posted

技术标签:

【中文标题】如何在 ios 的 swreveal 视图控制器中推送弹出窗口?【英文标题】:How can i push pop in swreveal view controller in ios? 【发布时间】:2016-11-26 04:32:04 【问题描述】:

我有一个像 Facebook 这样的应用程序。我想在 swreveal 视图控制器中推送和弹出。怎样才能做到这一点?检查下图。

任何帮助将不胜感激。

【问题讨论】:

AppCoda 不久前使用 SWRevealViewController 做了一个教程。他们给出了非常详细的说明。 appcoda.com/ios-programming-sidebar-navigation-menu @Erik 请检查图片.. 【参考方案1】:

我会有一个这样的故事板:

在登录视图控制器中:

    @IBAction func skip(_ sender: Any) 
    // Show dashboard

    let sb = UIStoryboard(name: "Main", bundle: nil)
    let controller = sb.instantiateViewController(withIdentifier: "DashboardNavigationController")

    revealViewController().setFront(controller, animated: true)


@IBAction func validateUser(_ sender: Any) 
    // show profile

    // Here test for valid user name and password
    // If OK
    let sb = UIStoryboard(name: "Main", bundle: nil)
    let dashboardNC = sb.instantiateViewController(withIdentifier: "DashboardNavigationController") as! UINavigationController

    let profileVC = sb.instantiateViewController(withIdentifier: "ProfileViewController")
    dashboardNC .pushViewController(profileVC, animated: false)

    revealViewController().setFront(dashboardNC, animated: true)


@IBAction func dismissKeyboard(_ textField: UITextField) 
    textField.resignFirstResponder()

在MenuTableViewController(SideMenu)中:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    tableView.deselectRow(at: indexPath, animated: true)

    // ...
    let dashboardNC = revealViewController().frontViewController as! UINavigationController
    let nc = revealViewController().frontViewController as! UINavigationController
    let vc = nc.topViewController

    if !(vc is ProfileViewController) 
        // Instantiate controller from story board
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let controller = sb.instantiateViewController(withIdentifier: "ProfileViewController")
        dashboardNC.pushViewController(controller, animated: false)
    

    // Push it with SWRevealViewController
    revealViewController().pushFrontViewController(dashboardNC, animated: true)

仪表板视图控制器:

class DashboardViewController: UIViewController 

@IBOutlet weak var revealButton: UIBarButtonItem!
@IBOutlet weak var rightButton: UIBarButtonItem!

override func viewDidLoad() 
    super.viewDidLoad()

    revealButton.target = revealViewController()
    revealButton.action = #selector(SWRevealViewController.revealToggle(_:))

    rightButton.target = revealViewController()
    rightButton.action = #selector(SWRevealViewController.rightRevealToggle(_:))

    revealViewController().tapGestureRecognizer()
    revealViewController().panGestureRecognizer()

    revealViewController().rearViewRevealOverdraw = 0
    revealViewController().rightViewRevealOverdraw = 0

不是 Objective-C,但你可以轻松翻译!

【讨论】:

能不能转换成objc 不,我认为这很简单,您可以为此付出努力。 我是ios新手 是的,那么你必须学习苹果的文档。强烈推荐! 请帮我解决这个问题...我知道导航但它是第三方这就是我感到困惑的原因【参考方案2】:

在您的应用委托中,您必须通过窗口的 rootViewController 管理登录/仪表板。

第 1 步: 在你的 AppDelegate 中写一个方法,例如调用setupRootVC()

func setupRootVC()
    if userIsLoggedIn
       window.rootViewController = yourSWRevealControllerObj
    else
       window.rootViewController = yourLoginControllerObj
    

第2步:didFinishLaunchingWithOptions方法调用setupRootVC()方法。

第三步:在你的LoginVC中,用户登录成功后调用AppDelegate的setupRootVC()方法。

第 4 步:确保 frontViewControllerSWRevealController 位于 UINavigationController 内,以便您可以推入并弹出它。

我建议您阅读更多有关 iOS 应用架构以及 rootViewControllerUINavigationController 工作原理的信息。 希望对您有所帮助。

【讨论】:

能否给demo..in Objective c 告诉我你有什么尝试,*** 不适合你的要求。【参考方案3】:

如果你想从 swreveal 推送到任何控制器

UIStoryboard*Storyboard=[AppDelegate storyBoardType];
    yourController  *your=(yourController*)[Storyboard instantiateViewControllerWithIdentifier:@"yourControllerId"];

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

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

        

从任何控制器到 swreveal 视图控制器,您必须在您的操作单击中添加此行

 [self.revealViewController revealToggleAnimated:YES];

【讨论】:

【参考方案4】:

你可以使用 UINavigationController 的方法:

- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);

但请注意,它设置了整个导航控制器堆栈。 所以你可能不得不采取你当前的视图控制器状态 从属性

@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; 

分配一个新的

NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController viewControllers];

[controllers addObject:VC1];
[controllers addObject:VC2];
[controllers addObject:VC3];
[self.navigationController setViewControllers:controllers animated:YES];

【讨论】:

以上是关于如何在 ios 的 swreveal 视图控制器中推送弹出窗口?的主要内容,如果未能解决你的问题,请参考以下文章

集合视图变为 Null

如何将值从 tableview 传递到 collectionview

侧边菜单控制器

带有 TabBar 和 SlideMenu 的 iOS 应用程序

如何在 iOS 中显示小型模态视图控制器?

在 iOS 中单击按钮时,如何在视图控制器顶部显示视图?