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.
Pruebe la aplicación [TweetStation] (https://github.com/migueldeicaza/TweetStation) - se basa en gran medida en MT.D – Jason
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. –
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. –