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.
Provate a guardare l'app [TweetStation] (https://github.com/migueldeicaza/TweetStation) - fa molto affidamento su MT.D – Jason
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. –
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. –