1

Я хочу использовать DialogViewController внутри UITabViewController.MonoTouch DialogViewController - почему это должно быть в первую очередь UINavigationController?

Проблема: Вложенные элементы не отображают панель навигации, и поэтому вернуться невозможно.

Когда я нажимаю свой класс (унаследованный от DialogViewController) на UINavigationController, тогда поведение верное. Если я использую один и тот же класс на вкладке UITabViewController (даже с базовым UINavigationController), тогда поведение неверно.

Может ли кто-нибудь помочь мне?

ответ

5

Хотя вопрос не помог с некоторым образцом кода, я сделал небольшой пример, надеясь решить ваш вопрос. В этом примере я использовал шаблон Tabbed Application, который поставляется с Xamarin.iOS и назвал его TabbingTest.

Следующий код приведен в приложении AppDelegate. Изменение метода FinishedLaunching содержит:

public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
{ 
    window = new UIWindow (UIScreen.MainScreen.Bounds); 

    var viewControllers = new UIViewController[] 
    { 
     CreateTabFor("Test", "first", new TestDialogController()), 
     CreateTabFor("Second", "second", new SecondViewController()), 
    }; 

    tabBarController = new UITabBarController(); 
    tabBarController.ViewControllers = viewControllers; 
    tabBarController.SelectedViewController = tabBarController.ViewControllers[0]; 

    window.RootViewController = tabBarController; 
    window.MakeKeyAndVisible(); 

    return true; 
} 

Затем добавьте следующие методы:

private int _createdSoFarCount = 0; 

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

private void SetTitleAndTabBarItem(UIViewController screen, string title, string imageName) 
{ 
    screen.Title = NSBundle.MainBundle.LocalizedString (title, title); 
    screen.TabBarItem = new UITabBarItem(title, UIImage.FromBundle(imageName), 
             _createdSoFarCount); 
    _createdSoFarCount++; 
} 

Создать класс с именем TestDialogController и вставьте следующий код внутри.

using System; 
using MonoTouch.Dialog; 
using MonoTouch.UIKit; 

namespace TabbingTest 
{ 
    public class TestDialogController : DialogViewController 
    { 
     public TestDialogController(): base(UITableViewStyle.Plain,null,false) 
     {  
      var root = new RootElement ("Tabbing test"){ 
       new Section(){ 
        new RootElement ("First level", 0, 0) { 
         new Section (null, "This is the first level."){ 
          new RootElement ("Second level", 0, 0) { 
           new Section (null, "This is the second level."){ 
            new BooleanElement ("Flipflops", false) 
           } 
          } 
         } 
        }} 
      }; 

      this.Root = root; 
     } 
    } 
} 

Теперь запустите приложение. Вы можете видеть, что даже вложенные элементы хорошо отображаются на панели навигации. Даже с многоуровневым вложением.

+0

Спасибо за образец кода, он отлично работает. Но я хочу начать с NavigationController в качестве корневого контроллера. Для этого я получаю две панели навигации - и это не то, что я хочу. Какие-нибудь дополнительные предложения? – Joerg