我如何在 ios 的 swreveal 视图控制器中推送弹出窗口?
How can i push pop in swreveal view controller in ios?
我有一个类似 Facebook 的应用程序。我想在 swreveal 视图控制器中推送和弹出。怎样才能做到这一点?检查下图。
任何帮助将不胜感激。
在您的应用委托中,您必须通过 window 的 rootViewController 来管理 Login/Dashboard。
第 1 步:
在您的 AppDelegate 中编写一个方法,例如调用 setupRootVC()
func setupRootVC(){
if userIsLoggedIn{
window.rootViewController = yourSWRevealControllerObj
}else{
window.rootViewController = yourLoginControllerObj
}
}
步骤 2: 从 didFinishLaunchingWithOptions
方法调用 setupRootVC()
方法。
第 3 步: 在您的 LoginVC
中,用户成功登录后调用 AppDelegate 的 setupRootVC()
方法。
第 4 步:确保 SWRevealController
的 frontViewController
在 UINavigationController
内,这样您就可以推入和弹出它。
我建议您阅读更多有关 iOS 应用架构以及 rootViewController
和 UINavigationController
工作原理的信息。
希望对您有所帮助。
如果你想从 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];
我会有这样的故事板:
在登录视图控制器中:
@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但您可以轻松翻译!
你可以使用 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];
我有一个类似 Facebook 的应用程序。我想在 swreveal 视图控制器中推送和弹出。怎样才能做到这一点?检查下图。
任何帮助将不胜感激。
在您的应用委托中,您必须通过 window 的 rootViewController 来管理 Login/Dashboard。
第 1 步:
在您的 AppDelegate 中编写一个方法,例如调用 setupRootVC()
func setupRootVC(){
if userIsLoggedIn{
window.rootViewController = yourSWRevealControllerObj
}else{
window.rootViewController = yourLoginControllerObj
}
}
步骤 2: 从 didFinishLaunchingWithOptions
方法调用 setupRootVC()
方法。
第 3 步: 在您的 LoginVC
中,用户成功登录后调用 AppDelegate 的 setupRootVC()
方法。
第 4 步:确保 SWRevealController
的 frontViewController
在 UINavigationController
内,这样您就可以推入和弹出它。
我建议您阅读更多有关 iOS 应用架构以及 rootViewController
和 UINavigationController
工作原理的信息。
希望对您有所帮助。
如果你想从 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];
我会有这样的故事板:
在登录视图控制器中:
@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但您可以轻松翻译!
你可以使用 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];