Как я могу добавить контроллер диалогового представления в качестве подпредставления в UIView или наоборот?

Я некоторое время искал в Интернете какие-либо ресурсы по этой теме и не нашел ничего, что решило бы мою дилемму.

У меня есть контроллер диалогового представления, и его корень просто отображает список строк, аналогичный тому, как прокручивается представление музыкальной песни iphone. Что мне нужно, так это подпредставление, расположенное в верхней части экрана, и прокручиваемый DVC под ним. Мне нужно, чтобы вид сверху был всегда на виду, пока пользователь может прокручивать корневой элемент, потому что вид сверху будет содержать статистику.

Я попытался добавить подпредставление, но оно просто перекрывает dvc под ним, и я не смог найти способ добавить dvc в качестве подпредставления в UIView.

Любая помощь приветствуется.


person mp501    schedule 17.05.2012    source источник


Ответы (1)


Для этого нужен единственный контроллер корневого представления, в котором размещены два контроллера подпредставления. Одно подпредставление содержит статистику в верхней части окна. Нижнее подвид содержит контроллер навигации, в котором находится диалоговое окно.

using System;
using System.Collections.Generic;
using System.Linq;

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.Dialog;
using System.Drawing;

namespace delete201205203
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        UIWindow window;
        MyUIViewController _mvc;

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

            _mvc = new MyUIViewController ();

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

            return true;
        }
    }

    public class MyUIViewController : UIViewController
    {
        MyDialogViewController _dvc;
        UINavigationController _nav;
        StatisticsViewController _statistics;

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

            var root = new RootElement ("Root") {
                new Section ("Section") {
                    new EntryElement ("caption", "placeholder", ""),
                    new RootElement ("Root 2") {
                        new Section ("Section") {
                            new EntryElement ("caption", "placeholder", ""),
                            new StringElement ("Back", () => {
                                _nav.PopViewControllerAnimated (true);  
                            })
                        }
                    }
                }
            };

            _dvc = new MyDialogViewController (root);
            _nav = new UINavigationController (_dvc);
            _nav.SetNavigationBarHidden (true, false);
            _nav.View.Frame = new RectangleF (0, 70f,
                                              this.View.Bounds.Width, 
                                              this.View.Bounds.Height -70f);

            _statistics = new StatisticsViewController ();
            _statistics.View.Frame = new RectangleF (0, 0,
                                              this.View.Bounds.Width, 
                                              70f);

            this.AddChildViewController (_nav);
            this.View.AddSubview (_nav.View);

            this.AddChildViewController (_statistics);
            this.View.AddSubview (_statistics.View);
        }

        public override void ViewWillLayoutSubviews ()
        {
            base.ViewWillLayoutSubviews ();
            _nav.View.Frame = new RectangleF (0, 70f,
                                              this.View.Bounds.Width, 
                                              this.View.Bounds.Height -70f);

            _statistics.View.Frame = new RectangleF (0, 0,
                                              this.View.Bounds.Width, 
                                              70f);
        }

        public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
        {
            return true;
        }
    }

    public class StatisticsViewController : UIViewController
    {
        UILabel _label;
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();
            this.View.BackgroundColor = UIColor.White;

            _label = new UILabel (new RectangleF (this.View.Bounds.Width * .5f - 50f,
                                                  this.View.Bounds.Height * .5f -10f,
                                                  100f, 20f));
            _label.AutoresizingMask = UIViewAutoresizing.FlexibleMargins;

            _label.Text = "statistics";
            this.View.AddSubview (_label);

        }

        public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
        {
            return true;
        }
    }

    // This overrde is needed to ensure the pop view animation  
    // works correctly in landscape mode
    public class MyDialogViewController : DialogViewController
    {
        public MyDialogViewController (RootElement root) : base (root) {}
        public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation)
        {
            return true;
        }   
    }
}
person holmes    schedule 21.05.2012
comment
Большое спасибо, это именно то, что я хотел. То, что я пробовал, было примерно таким, но мне не хватало нескольких частей. Спасибо! - person mp501; 23.05.2012
comment
я использовал то же самое. но у меня есть одна проблема. Контроллер Dialogview выглядит идеально, но когда есть много элементов ввода, и если мы прокручиваем до нижнего элемента ввода, то клавиатура скрывает этот элемент. и этот элемент не прокручивается автоматически. может у кого-нибудь есть идеи? я создаю динамическую форму. - person SoftSan; 25.03.2014
comment
Это мне очень помогает !! Вы сэкономили мне много времени !! Спасибо :) - person SoftSan; 02.04.2014
comment
но у меня только одна проблема. в моем приложении первая страница - это страница списка, то есть UITableViewController, затем я перехожу к соответствующей форме при выборе элемента из списка. Я добавил радиокнопку в одну из моих форм для дальнейшей навигации. но я вижу кнопку «Назад» на странице выбора радио, которая возвращает меня на главную страницу списка. Я хочу скрыть кнопку «Назад» на странице выбора радио. ты знаешь, как этого добиться? - person SoftSan; 03.04.2014