From d8b7192d759d0dae78998c6a7ce05726f12507a8 Mon Sep 17 00:00:00 2001 From: Andrew Havens Date: Thu, 19 Apr 2018 15:56:58 -0700 Subject: [PATCH] Fix an issue preventing certain screen options from being applied when specified in certain scenarios. Fixes an issue where nav bar would not hide/show correctly when transitioning between screens. --- lib/ProMotion/delegate/delegate_module.rb | 23 ++++++++++++++++++++++- lib/ProMotion/screen/nav_bar_module.rb | 9 ++++++--- lib/ProMotion/screen/screen_module.rb | 5 +++-- lib/ProMotion/screen/screen_navigation.rb | 6 ++---- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/lib/ProMotion/delegate/delegate_module.rb b/lib/ProMotion/delegate/delegate_module.rb index 47b8cc8e..37178cc1 100644 --- a/lib/ProMotion/delegate/delegate_module.rb +++ b/lib/ProMotion/delegate/delegate_module.rb @@ -51,7 +51,7 @@ def ui_window end def open(screen, args={}) - screen = screen.new if screen.respond_to?(:new) + screen = set_up_screen_for_open(screen, args) self.home_screen = screen @@ -65,6 +65,27 @@ def open(screen, args={}) alias :open_screen :open alias :open_root_screen :open_screen + def set_up_screen_for_open(screen, args={}) + # Instantiate screen if given a class + screen = screen.new(args) if screen.respond_to?(:new) + + # Store screen options + screen.screen_options.merge(args) if screen.respond_to?(:screen_options) + + # Set title & modal properties + screen.title = args[:title] if args[:title] && screen.respond_to?(:title=) + screen.modal = args[:modal] if args[:modal] && screen.respond_to?(:modal=) + + # Hide bottom bar? + screen.hidesBottomBarWhenPushed = args[:hide_tab_bar] == true + + # Wrap in a PM::NavigationController? + screen.add_nav_bar(args) if args[:nav_bar] && screen.respond_to?(:add_nav_bar) + + # Return modified screen instance + screen + end + # DEPRECATED def status_bar? mp "The default behavior of `status_bar?` has changed. Calling `status_bar?` on AppDelegate may not return the correct result.", force_color: :yellow diff --git a/lib/ProMotion/screen/nav_bar_module.rb b/lib/ProMotion/screen/nav_bar_module.rb index 6875492e..c4cb154f 100644 --- a/lib/ProMotion/screen/nav_bar_module.rb +++ b/lib/ProMotion/screen/nav_bar_module.rb @@ -12,6 +12,7 @@ def navigation_controller def navigation_controller=(nav) self.navigationController = nav end + alias :nav_controller= :navigation_controller= def navigationController=(nav) @navigationController = nav @@ -59,9 +60,11 @@ def add_nav_bar(args = {}) self.navigationController.toolbarHidden = !args[:toolbar] unless args[:toolbar].nil? end - def view_will_appear(animated) - if @screen_options && !@screen_options[:hide_nav_bar].nil? - self.navigationController.setNavigationBarHidden(@screen_options[:hide_nav_bar], animated: false) + def update_nav_bar_visibility(animated) + return unless navigationController + hidden = @screen_options[:hide_nav_bar] + unless hidden.nil? + navigationController.setNavigationBarHidden(hidden, animated: animated) end end diff --git a/lib/ProMotion/screen/screen_module.rb b/lib/ProMotion/screen/screen_module.rb index edddee7a..fb28b582 100644 --- a/lib/ProMotion/screen/screen_module.rb +++ b/lib/ProMotion/screen/screen_module.rb @@ -9,7 +9,7 @@ module ScreenModule include ProMotion::SplitScreen if UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad || (UIDevice.currentDevice.systemVersion.to_i >= 8 ) attr_reader :parent_screen - attr_accessor :first_screen, :modal, :split_screen + attr_accessor :screen_options, :first_screen, :modal, :split_screen def screen_init(args = {}) @screen_options = args @@ -41,7 +41,8 @@ def view_did_load end def view_will_appear(animated) - super + update_nav_bar_visibility(animated) + self.will_appear self.will_present if isMovingToParentViewController diff --git a/lib/ProMotion/screen/screen_navigation.rb b/lib/ProMotion/screen/screen_navigation.rb index 9b1f3dd8..6e757e93 100644 --- a/lib/ProMotion/screen/screen_navigation.rb +++ b/lib/ProMotion/screen/screen_navigation.rb @@ -78,12 +78,11 @@ def push_view_controller(vc, nav_controller=nil, animated=true) protected def set_up_screen_for_open(screen, args={}) - # Instantiate screen if given a class - screen = screen.new if screen.respond_to?(:new) + screen = screen.new(args) if screen.respond_to?(:new) # Store screen options - screen.instance_variable_set(:@screen_options, args) + screen.screen_options.merge(args) if screen.respond_to?(:screen_options) # Set parent screen.parent_screen = self if screen.respond_to?(:parent_screen=) @@ -100,7 +99,6 @@ def set_up_screen_for_open(screen, args={}) # Return modified screen instance screen - end def ensure_wrapper_controller_in_place(screen, args={})