Структурирование приложения 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's 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); };            
    }
}

Create подкласс элементов по мере необходимости:

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. , как я и думал М.Т.Д. идеально подходит для этого.

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

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

10
задан SoftSan 2 June 2014 в 10:30
поделиться