10

Xamarin.com上的示例中,您可以构建基本M.T. Dialog应用程序,但如何构建现实生活中的应用程序?

你:

1)从那里创建一DialogViewController棵树view/RootElement,或者,

DialogViewController2)为每个视图创建一个UINavigationController并根据需要使用并推送它?

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

修订

可能没有一个正确的答案,但我想出的似乎对我们有用。上面的数字 2 是选择的,下面是当前存在的代码示例。我们所做的是创建一个导航控制器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); };            
    }
}

根据需要创建元素的子类:

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

工作流的当前想法是一个应用程序,它以 Default.png 的 jpg 开始,淡入第一个视图,并带有一个可以移动到主应用程序的流控制按钮。这个视图是我之前工作的M.T.D. (MonoTouch.Dialog),它是一个带有图像的文本行表。单击每一行时,它会移动到另一个视图,该视图具有更详细的行/文本。

该应用程序还支持应用程序内购买,因此如果客户希望购买更多产品,则切换到另一个视图进行购买交易。这部分是切换到 的主要原因M.T.D.,因为我认为M.T.D.这对它来说是完美的。

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

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

4

3 回答 3

1

我也使用了您所说的选项 2,它工作得非常好,因为您可以在每个根视图的基础上编辑工具栏选项等。

于 2012-09-27T15:34:20.637 回答
1

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

我也查看了 TweetStation 应用程序,我发现它是一个有用的参考,但相关文档明确指出它并不是试图作为如何构建 MonoTouch 应用程序的示例。

于 2012-05-28T09:17:47.003 回答
0

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

于 2014-06-02T10:27:42.457 回答