10

Dagli esempi di Xamarin.com è possibile creare applicazioni base M.T. Dialog, ma come si crea un'applicazione di vita reale?Strutturazione di un'applicazione MonoTouch.Dialog

Ti:

1) creare un unico DialogViewController e albero ogni view/RootElement da lì o,

2) Creare una DialogViewController per ogni vista e utilizzare il UINavigationController e spingerlo in base alle esigenze?

A seconda della risposta, la risposta migliore è come? Ho creato l'app per le attività di esempio, quindi ho capito di aggiungere elementi a una tabella, selezionarla per andare alla vista "successiva" per la modifica, ma come fare clic per la modifica? Come fare clic su un pulsante, andare alla successiva vista se la risposta è il numero 1?

Revised:

Probabilmente non esiste una risposta giusta, ma quello che è venuta in mente sembra funzionare per noi. Il numero 2 di sopra è ciò che è stato scelto, sotto c'è un esempio del codice così com'è attualmente. Quello che abbiamo fatto è stato creare un controller di navigazione in AppDelegate e dare accesso ad esso per tutta la domanda come questa:

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

Allora ogni Dialog ha una struttura come questa:

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

Creare una sottoclasse di elementi come necessario:

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

L'idea corrente di un flusso di lavoro è un'app che inizia con un jpg di Default.png che sfuma nella prima vista, con un/i pulsante/i di controllo del flusso che passerebbe all'app principale. Questa vista, che avevo funzionato precedentemente a M.T.D. (MonoTouch.Dialog), che è una tabella di righe di testo con un'immagine. Quando si fa clic su ogni riga, si passa a un'altra vista che ha la riga/il testo in modo più dettagliato.

L'app supporta anche gli acquisti in-app, quindi se il cliente desidera acquistare più prodotti, passa a un'altra vista per effettuare gli acquisti. Questa parte è stata la ragione principale per passare a M.T.D., poiché pensavo che lo M.T.D. sarebbe perfetto per questo.

Infine ci sarebbe un impostazioni di visualizzazione a riattivare gli acquisti, ecc

PS Come si fa a sapere quando l'applicazione è non-minimizzato? Vorremmo mostrare di nuovo la dissolvenza nell'immagine.

+0

Provate a guardare l'app [TweetStation] (https://github.com/migueldeicaza/TweetStation) - fa molto affidamento su MT.D – Jason

+0

Questo non aiuta, poiché non vi è alcuna spiegazione sul perché sia ​​fatto qualcosa, come 5 DVC. Quello che voglio sapere è come nidificare le finestre di dialogo, usando il metodo 1 o 2 sopra. –

+0

Chuck, sarebbe di grande aiuto se descrivete che tipo di applicazione avete in mente e se avete un worfklow che volete ottenere. Allora le cose diventeranno più chiare. Pensi di poter pubblicare un modello balsamico di ciò che stai cercando di fare? Potrei commentare come potresti ottenere ogni passo con quello. –

risposta

1

Mi sono fatto le stesse domande. Ho usato il framework di Iniezione delle Dipendenze Funq e ho creato un nuovo DialogViewController per ogni vista. È lo stesso approccio che ho usato in precedenza per lo sviluppo di applicazioni ASP.NET MVC e significa che posso mantenere la logica del controller ben separata. I sottoclasse DialogViewController per ogni vista che mi consente di passare al controller tutti i dati dell'applicazione richiesti per quel particolare controller. Non sono sicuro se questo è l'approccio consigliato ma finora funziona per me.

Anche io ho guardato l'applicazione TweetStation e trovo che sia un utile riferimento ma la documentazione associata specifica che non sta cercando di essere un esempio di come strutturare un'applicazione MonoTouch.

1

Io uso l'opzione 2 che hai dichiarato, funziona abbastanza bene in quanto sei in grado di modificare le opzioni della barra degli strumenti in base alla vista radice e così via.

0

L'opzione 2 è più fattibile, in quanto offre anche un maggiore controllo su ogni DialogViewController. Può anche essere d'aiuto se si desidera caricare la vista in modo condizionale.

Problemi correlati