Структурирование приложения MonoTouch.Dialog

Из примеров в Xamarin.com вы можете создавать базовые приложения M.T. Dialog, но как вы создаете приложение для реальной жизни?

Вы:

1) Создайте один DialogViewController и дерево каждый view/RootElement оттуда или,

2) Создайте DialogViewController для каждого вида и используйте UINavigationController и нажмите его, если необходимо?

В зависимости от вашего ответа лучший ответ - как? Я создал пример приложения задачи, поэтому я понимаю добавление элементов в таблицу, щелкните по нему, чтобы перейти к "следующему" виду для редактирования, но как щелкнуть, чтобы не редактировать? Как нажать кнопку, перейдите к следующему виду, если ответ - номер 1?

Исправленный вариант

Вероятно, нет ни одного правильного ответа, но то, что я придумал, похоже, работает на нас. Номер 2 сверху - это то, что было выбрано, ниже приведен пример кода, который существует в настоящее время. Что мы сделали, так это создать контроллер навигации в AppDelegate и предоставить ему доступ к нему в течение всего приложения:

public partial class AppDelegate : UIApplicationDelegate
{
    public UIWindow window { get; private set; }
    //< There a Window property/field which we chose not to bother with

    public static AppDelegate Current { get; private set; }
    public UINavigationController NavController { get; private set; }

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

        // See About Controller below
        DialogViewController about = new AboutController();
        NavController.PushViewController(about, true);

        window.RootViewController = NavController;
        window.MakeKeyAndVisible ();
        return true;
    }
}

Тогда каждый Dialog имеет такую ​​структуру:

public class AboutController : DialogViewController
{
    public delegate void D(AboutController dvc);
    public event D ViewLoaded = delegate { };

    static About about;
    public AboutController()
        : base(about = new About())
    {
        Autorotate = true;
        about.SetDialogViewController(this);
    }

    public override void LoadView()
    {
        base.LoadView();
        ViewLoaded(this);
    }
}

public class About : RootElement
{
    static AboutModel about = AboutVM.About;

    public About()
        : base(about.Title)
    {
        string[] message = about.Text.Split(...);
        Add(new Section(){
            new AboutMessage(message[0]),
            new About_Image(about),
            new AboutMessage(message[1]),
        });
    }

    internal void SetDialogViewController(AboutController dvc)
    {
        var next = new UIBarButtonItem(UIBarButtonSystemItem.Play);
        dvc.NavigationItem.RightBarButtonItem = next;
        dvc.ViewLoaded += new AboutController.D(dvc_ViewLoaded);
        next.Clicked += new System.EventHandler(next_Clicked);
    }

    void next_Clicked(object sender, System.EventArgs e)
    {
        // Load next controller
        AppDelegate.Current.NavController.PushViewController(new IssuesController(), true);
    }

    void dvc_ViewLoaded(AboutController dvc)
    {
        // Swipe location: https://gist.github.com/2884348
        dvc.View.Swipe(UISwipeGestureRecognizerDirection.Left).Event +=
            delegate { next_Clicked(null, null); };            
    }
}

Создайте подкласс для элементов по мере необходимости:

public class About_Image : Element, IElementSizing
{
    static NSString skey = new NSString("About_Image");
    AboutModel about;
    UIImage image;

    public About_Image(AboutModel about)
        : base(string.Empty)
    {
        this.about = about;
        FileInfo imageFile = App.LibraryFile(about.Image ?? "filler.png");
        if (imageFile.Exists)
        {
            float size = 240;
            image = UIImage.FromFile(imageFile.FullName);
            var resizer = new ImageResizer(image);
            resizer.Resize(size, size);
            image = resizer.ModifiedImage;
        }
    }

    public override UITableViewCell GetCell(UITableView tv)
    {
        var cell = tv.DequeueReusableCell(skey);
        if (cell == null)
        {
            cell = new UITableViewCell(UITableViewCellStyle.Default, skey)
            {
                SelectionStyle = UITableViewCellSelectionStyle.None,
                Accessory = UITableViewCellAccessory.None,
            };
        }
        if (null != image)
        {
            cell.ImageView.ContentMode = UIViewContentMode.Center;
            cell.ImageView.Image = image;
        }
        return cell;
    }

    public float GetHeight(UITableView tableView, NSIndexPath indexPath)
    {
        float height = 100;
        if (null != image)
            height = image.Size.Height;
        return height;
    }

    public override void Selected(DialogViewController dvc, UITableView tableView, NSIndexPath indexPath)
    {
        //base.Selected(dvc, tableView, path);
        tableView.DeselectRow(indexPath, true);
    }
}

@miquel

Текущая идея рабочего процесса - это приложение, которое начинается с jpg Default.png, который исчезает в первом представлении, с кнопками управления потоками, которые будут перемещаться в основное приложение. Это представление, с которым я работал до M.T.D. (MonoTouch.Dialog), который представляет собой таблицу текстовых строк с изображением. Когда каждая строка нажата, она перемещается в другое представление, которое содержит строку/текст более подробно.

Приложение также поддерживает покупку в приложении, поэтому, если клиент хочет приобрести больше продукта, затем переключитесь на другое представление, чтобы совершить покупку (покупки). Эта часть была основной причиной перехода на M.T.D., поскольку я думал, что M.T.D. будет идеальным для него.

Наконец, появится окно настроек для повторного включения покупок и т.д.

PS Как узнать, когда приложение не минимизировано? Мы хотели бы снова показать изображение в образе.

Ответ 1

Я задавал себе те же вопросы. Я использовал Funq Framework Injection Dependency, и я создаю новый DialogViewController для каждого представления. Это фактически тот же подход, который я использовал ранее, разрабатывая приложения ASP.NET MVC, и это означает, что я могу логически разделить логику контроллера. я подкласс DialogViewController для каждого представления, который позволяет мне передать контроллеру любые данные приложения, необходимые для этого конкретного контроллера. Я не уверен, что это рекомендуемый подход, но пока он работает для меня.

Я тоже посмотрел приложение TweetStation, и я нашел его полезной ссылкой, но связанная с ним документация специально говорит о том, что она не пытается быть примером того, как структурировать приложение MonoTouch.

Ответ 2

Я использую вариант 2, который вы указали также, он работает довольно хорошо, так как вы можете редактировать параметры панели инструментов для каждого корневого представления и т.д.

Ответ 3

Вариант 2 более возможен, так как он также дает вам больше контроля над каждым DialogViewController. Он также может помочь, если вы хотите условно загрузить представление.