Menu 有没有人让Xamarin边栏、MVVMCross和故事板一起工作?
我已经尝试了所有我能在网上找到的排列方式,但似乎都无法实现 我在故事板中定义了我的iOS应用程序UI,MVVM框架主要是MVVMCross,并加入了一些反应UI以增加味道 我定义了一个RootViewController,在其中生成附加到AppDelegate的SideBarController,如下所示:Menu 有没有人让Xamarin边栏、MVVMCross和故事板一起工作?,menu,xamarin,storyboard,mvvmcross,flyout,Menu,Xamarin,Storyboard,Mvvmcross,Flyout,我已经尝试了所有我能在网上找到的排列方式,但似乎都无法实现 我在故事板中定义了我的iOS应用程序UI,MVVM框架主要是MVVMCross,并加入了一些反应UI以增加味道 我定义了一个RootViewController,在其中生成附加到AppDelegate的SideBarController,如下所示: [Register ("AppDelegate")] public partial class AppDelegate : MvxApplicationDelegate { publ
[Register ("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
public override UIWindow Window {
get;
set;
}
public AppDelegate ()
{
}
public SidebarController SidebarController { get; set; }
public override void FinishedLaunching (UIApplication application)
{
var presenter = new MvxModalSupportTouchViewPresenter (this, Window);
var setup = new Setup (this, presenter);
setup.Initialize ();
var startUp = Mvx.Resolve<IMvxAppStart> ();
startUp.Start ();
}
}
在RootViewController中,我有:
public override void ViewDidLoad()
{
base.ViewDidLoad();
if (ViewModel == null)
return;
var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
appDelegate.SidebarController = new SidebarController (this,
(UIViewController)this.CreateViewControllerFor<LoginViewModel>(),
(UIViewController)this.CreateViewControllerFor<SideMenuViewModel>());
appDelegate.SidebarController.MenuWidth = 250;
appDelegate.SidebarController.ReopenOnRotate = false;
appDelegate.SidebarController.MenuLocation = SidebarController.MenuLocations.Right;
}
在用户成功登录后,他们将被导航到一个带有汉堡按钮的登录页面。用户单击burger按钮后,不会显示侧菜单,但会显示执行ToggleMenu调用前后的所有跟踪。我绞尽脑汁想让它发挥作用,但3天后我想我可能给自己造成了脑震荡
有人试过让这个组合工作吗 对我来说,它正在发挥作用。我不确定您的问题在哪里,但这是我的代码:
[Register ("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
UIWindow window;
public RootViewController RootViewController { get { return window.RootViewController as RootViewController; } }
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
var presenter = new Presenter(this, window);
var setup = new Setup(this, presenter);
setup.Initialize();
var startup = Mvx.Resolve<IMvxAppStart>();
startup.Start();
window.MakeKeyAndVisible();
return true;
}
}
对于根控制器:
public class RootViewController: UIViewController, IMvxCanCreateTouchView
{
public SidebarController SidebarController { get; private set; }
private UIViewController root;
public RootViewController (UIViewController root)
{
this.root = root;
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var menuContentView = this.CreateViewControllerFor<MenuViewModel> () as MenuViewController;
SidebarController = new SidebarController (this, root, menuContentView) {
MenuLocation = SidebarController.MenuLocations.Left,
HasShadowing = false
};
}
public void NavigateToView (UIViewController view)
{
SidebarController.ChangeContentView (new UINavigationController (view));
}
}
作为其他控制器的基类,我有:
public interface IControllerWithCustomNavigation
{
void NavigateToView (UIViewController controller);
}
public class BaseController<TViewModel>: MvxViewController where TViewModel: BaseViewModel
{
protected bool NavigationBarEnabled = true;
public new TViewModel ViewModel {
get { return (TViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
public BaseController (string nib) : base (nib, null)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
if (NavigationBarEnabled) {
NavigationController.NavigationBarHidden = false;
updateNavigationBar ();
if (isRootViewModel()) {
addNavigationBarItemForMenu ();
}
} else if (NavigationController != null) {
NavigationController.NavigationBarHidden = true;
}
}
private void updateNavigationBar()
{
var navigationBar = NavigationController.NavigationBar;
var colorTint = UIColor.FromRGB (133, 231, 110);
var colorWhite = UIColor.White;
navigationBar.BarTintColor = colorWhite;
navigationBar.TintColor = colorTint;
navigationBar.SetTitleTextAttributes (new UITextAttributes {
TextColor = UIColor.FromRGB (13, 19, 26)
});
}
private bool isRootViewModel()
{
return NavigationController.ViewControllers.Length < 2; // Every view, even the RootView, is counted here.
}
private void addNavigationBarItemForMenu()
{
var sidebarButton = new UIBarButtonItem (
UIImage.FromFile ("menu_icon.png"),
UIBarButtonItemStyle.Plain,
(object sender, EventArgs e) => {
(UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.SidebarController.ToggleMenu();
}
);
NavigationItem.SetLeftBarButtonItem (sidebarButton, true);
}
public virtual void NavigateToView (UIViewController controller)
{
(UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.NavigateToView (controller);
}
}
对我来说,它正在发挥作用。我不确定您的问题在哪里,但这是我的代码:
[Register ("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
UIWindow window;
public RootViewController RootViewController { get { return window.RootViewController as RootViewController; } }
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
var presenter = new Presenter(this, window);
var setup = new Setup(this, presenter);
setup.Initialize();
var startup = Mvx.Resolve<IMvxAppStart>();
startup.Start();
window.MakeKeyAndVisible();
return true;
}
}
对于根控制器:
public class RootViewController: UIViewController, IMvxCanCreateTouchView
{
public SidebarController SidebarController { get; private set; }
private UIViewController root;
public RootViewController (UIViewController root)
{
this.root = root;
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var menuContentView = this.CreateViewControllerFor<MenuViewModel> () as MenuViewController;
SidebarController = new SidebarController (this, root, menuContentView) {
MenuLocation = SidebarController.MenuLocations.Left,
HasShadowing = false
};
}
public void NavigateToView (UIViewController view)
{
SidebarController.ChangeContentView (new UINavigationController (view));
}
}
作为其他控制器的基类,我有:
public interface IControllerWithCustomNavigation
{
void NavigateToView (UIViewController controller);
}
public class BaseController<TViewModel>: MvxViewController where TViewModel: BaseViewModel
{
protected bool NavigationBarEnabled = true;
public new TViewModel ViewModel {
get { return (TViewModel)base.ViewModel; }
set { base.ViewModel = value; }
}
public BaseController (string nib) : base (nib, null)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
if (NavigationBarEnabled) {
NavigationController.NavigationBarHidden = false;
updateNavigationBar ();
if (isRootViewModel()) {
addNavigationBarItemForMenu ();
}
} else if (NavigationController != null) {
NavigationController.NavigationBarHidden = true;
}
}
private void updateNavigationBar()
{
var navigationBar = NavigationController.NavigationBar;
var colorTint = UIColor.FromRGB (133, 231, 110);
var colorWhite = UIColor.White;
navigationBar.BarTintColor = colorWhite;
navigationBar.TintColor = colorTint;
navigationBar.SetTitleTextAttributes (new UITextAttributes {
TextColor = UIColor.FromRGB (13, 19, 26)
});
}
private bool isRootViewModel()
{
return NavigationController.ViewControllers.Length < 2; // Every view, even the RootView, is counted here.
}
private void addNavigationBarItemForMenu()
{
var sidebarButton = new UIBarButtonItem (
UIImage.FromFile ("menu_icon.png"),
UIBarButtonItemStyle.Plain,
(object sender, EventArgs e) => {
(UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.SidebarController.ToggleMenu();
}
);
NavigationItem.SetLeftBarButtonItem (sidebarButton, true);
}
public virtual void NavigateToView (UIViewController controller)
{
(UIApplication.SharedApplication.Delegate as AppDelegate).RootViewController.NavigateToView (controller);
}
}
因此,在查看了发布的代码之后,实际上对他以前的文章进行了一些窥探,我决定最好创建我自己的MvxViewPresenter,到目前为止它还可以工作
public class SideBarControllerTouchViewPresenter : MvxModalSupportTouchViewPresenter
{
private UIWindow _window;
public SidebarController SidebarController {
get ;
set ;
}
public UIViewController RootController {
get;
private set;
}
public SideBarControllerTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window)
: base(applicationDelegate, window)
{
_window = window;
}
public override void ChangePresentation (Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
{
base.ChangePresentation (hint);
}
protected override void ShowFirstView (UIViewController viewController)
{
base.ShowFirstView (viewController);
}
protected override UINavigationController CreateNavigationController (UIViewController viewController)
{
var navController = new UINavigationController (viewController);
var menuController = UIStoryboard.FromName ("storyboard", null).InstantiateViewController ("MenuTableViewController") as MenuTableViewController;
RootController = new UIViewController ();
SidebarController = new SidebarController (this.RootController, navController, menuController);
return navController;
}
protected override void SetWindowRootViewController (UIViewController controller)
{
_window.AddSubview (RootController.View);
_window.RootViewController = RootController;
}
}
谢谢你把我带到那里 因此,在查看了发布的代码之后,我对他以前的文章进行了一些窥探,我决定最好创建我自己的MvxViewPresenter,目前为止它还可以工作
public class SideBarControllerTouchViewPresenter : MvxModalSupportTouchViewPresenter
{
private UIWindow _window;
public SidebarController SidebarController {
get ;
set ;
}
public UIViewController RootController {
get;
private set;
}
public SideBarControllerTouchViewPresenter (UIApplicationDelegate applicationDelegate, UIWindow window)
: base(applicationDelegate, window)
{
_window = window;
}
public override void ChangePresentation (Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
{
base.ChangePresentation (hint);
}
protected override void ShowFirstView (UIViewController viewController)
{
base.ShowFirstView (viewController);
}
protected override UINavigationController CreateNavigationController (UIViewController viewController)
{
var navController = new UINavigationController (viewController);
var menuController = UIStoryboard.FromName ("storyboard", null).InstantiateViewController ("MenuTableViewController") as MenuTableViewController;
RootController = new UIViewController ();
SidebarController = new SidebarController (this.RootController, navController, menuController);
return navController;
}
protected override void SetWindowRootViewController (UIViewController controller)
{
_window.AddSubview (RootController.View);
_window.RootViewController = RootController;
}
}
谢谢你把我带到那里 谢谢你的代码,我来看看。看起来您的UI使用的是XIB,而我的UI在故事板中。我知道这不重要,但这是我能找到的大多数代码之间唯一的区别。谢谢你的代码,我会看一下。看起来您的UI使用的是XIB,而我的UI在故事板中。我知道这不重要,但这是我能找到的大多数代码之间的唯一区别。我花了一段可怕的时间让这些东西工作,但我没有使用XIB或故事板。。。我还需要一个自定义的演示者吗?我正在经历一段可怕的时间来让这些东西工作,但我没有使用XIB或故事板。。。我还需要自定义演示者吗?