10

De los ejemplos en Xamarin.com puede crear aplicaciones básicas M.T. Dialog, pero ¿cómo se crea una aplicación de la vida real?Estructuración de una aplicación MonoTouch.Dialog

¿Te:

1) crear una sola DialogViewController y el árbol de cada view/RootElement desde allí o,

2) Crear un DialogViewController para todas las vistas y el uso de la UINavigationController y empujarlo en cuando sea necesario?

Dependiendo de su respuesta, la mejor respuesta es ¿cómo? Creé la aplicación de tareas de ejemplo, así que entiendo agregar elementos a una tabla, hacer clic para ir a la vista 'siguiente' para editar, pero ¿cómo hacer clic para no editar? ¿Cómo hacer clic en un botón, ir a la vista siguiente si la respuesta es el número 1?

Revisado:

Probablemente no hay una respuesta correcta, pero lo que he llegado con parece funcionar para nosotros. El número 2 de arriba es lo que se eligió, a continuación se muestra un ejemplo del código tal como existe actualmente. Lo que hicimos fue crear un controlador de navegación en AppDelegate y dar acceso a lo largo de toda la aplicación como esta:

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; 
    } 
} 

Entonces cada Dialog tiene una estructura como esta:

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); };    
    } 
} 

Crear una subclase de elementos según sea necesario:

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

La idea actual de un flujo de trabajo es una aplicación que comienza con un jpg del Default.png que se desvanece en la primera vista, con un botón (s) de control de flujo que se moverá a la aplicación principal. Esta vista, que tenía trabajando anterior a M.T.D. (MonoTouch.Dialog), que es una tabla de filas de texto con una imagen. Cuando se hace clic en cada fila, se mueve a otra vista que tiene la fila/el texto con más detalle.

La aplicación también es compatible con la compra desde la aplicación, por lo que si el cliente desea comprar más del producto, cambie a otra vista para realizar la compra. Esta parte fue la razón principal para cambiar a M.T.D., ya que pensé que M.T.D. sería perfecto para ello.

Por último habría una vista de ajustes para volver a habilitar las compras, etc.

PS ¿Cómo se sabe cuando se minimiza la ONU-la aplicación? Nos gustaría mostrar el fundido en la imagen de nuevo.

+0

Pruebe la aplicación [TweetStation] (https://github.com/migueldeicaza/TweetStation) - se basa en gran medida en MT.D – Jason

+0

Eso no ayuda, ya que no hay ninguna explicación de por qué se hace algo, como 5 DVC. Lo que quiero saber es cómo anidar los diálogos, utilizando cualquiera de los métodos 1 o 2 anteriores. –

+0

Chuck, sería útil si describiera qué tipo de aplicación tiene en mente y si tiene un trabajo que desea lograr. Entonces las cosas se aclararán. ¿Crees que podrías publicar una maqueta balsámica de lo que estás tratando de hacer? Podría comentar cómo podrías lograr cada paso con eso. –

Respuesta

1

Me he estado haciendo las mismas preguntas. He utilizado el marco de inyección de dependencias Funq y creo un nuevo DialogViewController para cada vista. Es efectivamente el mismo enfoque que he usado anteriormente desarrollando aplicaciones ASP.NET MVC y significa que puedo mantener la lógica del controlador muy bien separada. Subclono DialogViewController para cada vista que me permite pasar al controlador cualquier información de aplicación requerida para ese controlador en particular. No estoy seguro de si este es el enfoque recomendado, pero hasta ahora me funciona.

También he mirado la aplicación TweetStation y la considero una referencia útil, pero la documentación asociada dice específicamente que no trata de ser un ejemplo de cómo estructurar una aplicación MonoTouch.

1

Utilizo la opción 2 que usted indicó también, funciona bastante bien, ya que puede editar las opciones de la barra de herramientas por vista de raíz y tal.

0

La opción 2 es más factible, ya que también le da más control en cada DialogViewController. También puede ser útil si desea cargar la vista de forma condicional.

Cuestiones relacionadas