1

UINavigationBarを実装するUITabBarControllerを作成しようとしています。これは、Xcodeで数分で実行できます。ただし、MonoTouchでMVVMCrossを使用するのに苦労しています。コードの一部を以下に示します-

最初のVCから(これはユーザーが利用規約に同意するためのものであるため、一度同意すると、それに戻るオプションはありません。したがって、真のフラグです)-

this.RequestNavigate<TabHostViewModel>(true);

私のtabBarはそのように設定されており、正常に機能します-

ViewControllers = new UIViewController[]
{
    CreateTabFor("Home", "", ViewModel.homeViewModel),
    CreateTabFor("History", "", ViewModel.journeyHistoryViewModel),
    CreateTabFor("Contacts", "", ViewModel.contactsViewModel),
    CreateTabFor("About", "", ViewModel.aboutViewModel),
};

...等。

ViewDidLoadのように最初のビュー(この場合はHomeView)を設定しようとしています-

this.NavigationController.NavigationBar.TintColor = myNavBarColour;

ただし、TabBarを設定するときに独自に作成しない限り、NavigationControllerは未定義のようです-

UIViewController HomeViewController = CreateTabFor("Home", "", ViewModel.homeViewModel);
UINavigationController HomeNavController = new UINavigationController(HomeViewController);

ViewControllers = new UIViewController[]
{
    HomeNavController,
    CreateTabFor("History", "", ViewModel.journeyHistoryViewModel),
    CreateTabFor("Contacts", "", ViewModel.contactsViewModel),
    CreateTabFor("About", "", ViewModel.aboutViewModel),
};

これで、ナビゲーションバーを使って好きなことを行うことができますが、問題は2つのナビゲーションバーがあり、1つはタイトルのない上部にあり、もう1つはそのすぐ下に作成した新しいものです。

何か考えがある人はいますか?

どうもありがとう。

4

1 に答える 1

0

私はあなたの設定について完全に明確ではありません。

ただし、あなたが探しているのは、会議のサンプルが行うことだと思います

このサンプル内:

  • ホームビューはタブバーをホストします
  • 各タブには独自の埋め込み NavigationController があります
  • 各サブビューは、いずれかのナビゲーション コントローラー内でホストされます

このコードは次のとおりです。

    private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
    {
        var controller = new UINavigationController();
        controller.NavigationBar.TintColor = UIColor.Black;
        var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
        SetTitleAndTabBarItem(screen, title, imageName);
        controller.PushViewController(screen, false);
        return controller;
    }

    private void SetTitleAndTabBarItem(UIViewController screen, string title, string imageName)
    {
        screen.Title = ViewModel.TextSource.GetText(title);
        screen.TabBarItem = new UITabBarItem(title, UIImage.FromBundle("Images/Tabs/" + imageName + ".png"),
                                             _createdSoFarCount);
        _createdSoFarCount++;
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        if (ViewModel == null)
        {
            _needViewDidLoadCall = true;
            return;
        }

        _needViewDidLoadCall = false;

        var viewControllers = new UIViewController[]
                              {
                                CreateTabFor("Welcome", "home", ViewModel.Welcome),
                                CreateTabFor("Sessions", "sessions", ViewModel.Sessions),
                                CreateTabFor("Favorites", "favorites", ViewModel.Favorites),
                                CreateTabFor("Tweets", "twitter", ViewModel.Twitter),
                              };
        ViewControllers = viewControllers;
        CustomizableViewControllers = new UIViewController[] { };
        SelectedViewController = ViewControllers[0];
    }

次に、ナビゲーションは Presenter ロジック (AppDelegate で構成) 内でインターセプトされます。ConferencePresenterは、ShowView ロジックを次のように延期します。

    public bool ShowView(IMvxTouchView view)
    {
        if (TryShowViewInCurrentTab(view))
            return true;

        return false;
    }

    private bool TryShowViewInCurrentTab(IMvxTouchView view)
    {
        var navigationController = (UINavigationController)this.SelectedViewController;
        navigationController.PushViewController((UIViewController)view, true);
        return true;
    }

このロジックは少し複雑ですが、このナビゲーションとプレゼンターの設計の目的は、アプリケーションに合わせてプレゼンテーションをカスタマイズできるようにすることです。これは実行時に動的に変更することもできます。たとえば、iPhone の代わりに iPad で異なるプレゼンテーション ロジックを使用することを選択できます。

于 2012-06-13T11:40:34.320 に答える