构建MonoTouch.Dialog应用程序

时间:2012-04-05 19:06:04

标签: uinavigationcontroller xamarin.ios monotouch.dialog dialogviewcontroller

Xamarin.com的示例中,您可以构建基本的M.T. Dialog应用,但是如何构建真实应用?

你是:

1)从那里创建一个DialogViewController和每{@ 1}}树,或

2)为每个视图创建view/RootElement并使用DialogViewController并根据需要将其推送?

根据您的回答,更好的回应是如何?我已经构建了示例任务应用程序,所以我理解向表中添加元素,单击它以转到“下一个”视图进行编辑,但是如何单击以进行非编辑?如果答案是1号,如何点击按钮,进入下一个视图?

可能没有一个正确的答案,但我想出的似乎对我们有用。上面的数字2是所选择的,下面是当前存在的代码的示例。我们所做的是在UINavigationController中创建一个导航控制器,并在整个应用程序中提供对它的访问,如下所示:

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

@miquel

当前工作流的想法是一个应用程序,它以一个jpg的Default.png开始,它会淡入第一个视图,并带有一个可以移动到主应用程序的流控制按钮。这个视图,我在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); } } 之前工作过,它是一个带有图像的文本行表。单击每一行时,它将移动到另一个具有更详细行/文本的视图。

该应用还支持应用内购买,因此如果客户希望购买更多产品,请切换到另一个视图来处理购买。这部分是切换到M.T.D. (MonoTouch.Dialog)的主要原因,因为我认为M.T.D.对它来说是完美的。

最后会有一个设置视图来重新启用购买等。

PS如何知道应用程序何时未最小化?我们想再次展示淡入淡出的形象。

3 个答案:

答案 0 :(得分:1)

我一直在问自己同样的问题。我已经使用了Funq依赖注入框架,并为每个视图创建了一个新的DialogViewController。它实际上与我以前开发的ASP.NET MVC应用程序使用的方法相同,这意味着我可以将控制器逻辑保持良好分离。我为每个视图子类化DialogViewController,它允许我将特定控制器所需的任何应用程序数据传递给控制器​​。我不确定这是否是推荐的方法,但到目前为止它对我有用。

我也看过TweetStation应用程序,我发现它是一个有用的参考,但相关文档明确说明它并不是一个如何构建MonoTouch应用程序的例子。

答案 1 :(得分:1)

我使用你所说的选项2,它可以很好地工作,因为你可以在每个根视图的基础上编辑工具栏选项等。

答案 2 :(得分:0)

选项2更可行,因为它还可以让您更好地控制每个DialogViewController。如果要有条件地加载视图,它也会有所帮助。