标签: monotouch.dialog

使用MonoTouch和MonoTouch.Dialog进行内存/资源管理

我有一个具有UITabBarController的MonoTouch应用程序,每个选项卡都是UINavigationController.其中一些包装UIViewController,它添加一个UITableView和一个UIToolbar,其他包装一个DialogViewController.

到目前为止,我没有太多关注内存/视图管理(我一直在模拟器中运行),但是当我开始在真实设备上进行测试时,我注意到由于内存条件不足导致的一些故障(例如,应用程序被终止,我从我的日志中发现在此之前调用了DidReceiveMemoryWarning).其他时候我注意到应用程序响应性的长时间暂停,我假设是由于GC循环.

到目前为止,我一直在假设我推送到导航堆栈的每个DialogViewController都会清理它的视图以及当我弹出它时分配的其他东西.但我开始意识到它可能并不那么容易,而且我需要开始调用Dispose().

有没有关于如何使用MonoTouch和MT.D处理资源和内存的最佳实践?特别:

  • 弹出后,是否需要在DialogViewController上调用Dispose?如果是这样,哪里最好这样做?(ViewDidUnload?DidReceiveMemoryWarning?析构函数?)
  • DVC是否会自动处理传递给它的RootElement等对象,还是我需要担心这个问题?它作为呈现表格单元格的一部分加载的UIImages如何(例如StyledStringElement)?
  • 有没有我应该调用GC.Collect()以更好地分隔集合的地方,以便在GC确实发生时不会在响应性方面受到一点打击?
  • 分代垃圾收集器是否有助于解决交互性问题,是否足够稳定以便在生产应用程序中使用?(我相信它仍然被称为MonoDevelop 3.0.2/MT 4.3.3中的"实验性")
  • 在DidReceiveMemoryWarning中我需要做些什么来降低iOS拍摄我的应用程序的可能性?由于每个不可见的视图控制器似乎都得到了这个调用,我假设我应该清理那个视图控制器的资源......我应该在ViewDidUnload中做同样的事情吗?
  • 我似乎没有调用我的ViewDidUnload(即使我得到了DidReceiveMemoryWarning).事实上,我不记得曾经在我的日志中看过它.如果iOS在DidReceiveMemoryWarning之后总是调用我的ViewDidUnload,我可以在ViewDidUnload中进行所有清理......在ViewDidUnload和DidReceiveMemoryWarning之间拆分清理责任的最佳方法是什么?

我为这个问题的一般性质道歉 - 这似乎是白皮书的一个好主题,但我找不到任何......

更新:使问题更具体:在使用Instruments和Xamarin Heapshot Profiler之后,我很清楚当用户弹出导航堆栈时我正在泄漏UIViewControllers.Rolf 为此提出了一个错误,它有两个重复,所以这不仅仅是我的真正问题.不幸的是,我没有找到泄漏的UIViewControllers的好方法 - 我还没有找到一个调用Dispose()的好地方.释放ViewDidLoad分配的资源的自然位置在ViewDidUnload消息中,但它永远不会在模拟器上调用,因此我的内存占用量不断增长.在设备上,我确实看到了DidReceiveMemoryWarning,但我不愿意使用它作为释放我的viewcontroller及其资源的地方,因为我无法保证iOS实际上会卸载我的视图,因此无法保证我的ViewDidLoad会再次被调用要么(导致ViewDidAppear需要针对其底层资源处置的情况进行防御性编码).我很想得到一些关于如何摆脱这个烂摊子的建议......

memory-management xamarin.ios ios monotouch.dialog

19
推荐指数
1
解决办法
3174
查看次数

MonoTouch.Dialog:通过触摸DialogViewController中的任何位置来解除键盘

注意:有两个类似的SO问题(1) (2),但它们都没有提供答案.

TL; DR:如何通过让用户触摸视图中的任何空白区域来解除MonoTouch.Dialog中的键盘?

我正在使用MonoTouch.Dialog和UITabBarController编写应用程序.我的一个标签是"设置"......

设置屏幕

当用户开始输入时,键盘会阻碍标签栏...

在此输入图像描述

使用MonoTouch.Dialog,解除键盘的唯一方法是转到最后一个字段并按"返回"键.考虑到用户在键盘消失之前无法按任何标签这一事实,我想要一个更好的方法来做到这一点.即,如果用户点击屏幕上的任何其他位置,则关闭.

没有MonoTouch.Dialog,它很简单:只需覆盖TouchesBegan并调用EndEditing.但这不适用于MT.D. 我已经尝试了子类化DialogViewController并覆盖那里的TouchesBegan,但它不起作用.我现在不知所措.

或者,我想知道,放弃标签栏会更好吗,所以我可以使用顶部带有"后退"按钮的UINavigationController,它不会被键盘隐藏?

xamarin.ios monotouch.dialog

16
推荐指数
1
解决办法
4012
查看次数

构建MonoTouch.Dialog应用程序

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

你呢:

1)从那里创建一个单独的DialogViewControllerview/RootElement或者,

2)DialogViewController为每个视图创建一个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 …
Run Code Online (Sandbox Code Playgroud)

uinavigationcontroller xamarin.ios monotouch.dialog dialogviewcontroller

10
推荐指数
1
解决办法
2076
查看次数

如何使用Xamarin在iOS 8中制作表格单元格和分隔符全宽?

我们有许多表格视图(使用Xamarin Monotouch对话框),它们是普通的(未分组),设计为全宽而不缩进.这一切在iOS 7中运行良好.虽然使用iOS 8模拟器,我们得到一个轻微的左缩进.

iOS 8有一个名为LayoutMargins的新属性.我们将该属性设置为零.像这样:

if (this.TableView.RespondsToSelector(new Selector("setSeparatorInset:")))
    this.TableView.SeparatorInset = UIEdgeInsets.Zero;

if (this.TableView.RespondsToSelector(new Selector("setLayoutMargins:")))
    this.TableView.LayoutMargins = UIEdgeInsets.Zero;
Run Code Online (Sandbox Code Playgroud)

这有一些影响 - 它删除了大约一半的缩进.但我们仍然看到一个轻微的缩进.是否有另一个属性控制iOS 8中的缩进?

这是截图... 在此输入图像描述

c# xamarin.ios monotouch.dialog xamarin ios8

10
推荐指数
1
解决办法
7431
查看次数

MonoTouch.Dialog:响应RadioGroup选择

我有一个由MonoTouch.Dialog创建的Dialog.无线电组中有一份医生名单:

    Section secDr = new Section ("Dr. Details") {
       new RootElement ("Name", rdoDrNames){
          secDrNames
    }
Run Code Online (Sandbox Code Playgroud)

我希望Element在选择Doctor之后更新代码.通知RadioElement已被选中的最佳方式是什么?

c# radio-button xamarin.ios ios monotouch.dialog

9
推荐指数
1
解决办法
4522
查看次数

我可以通过触摸DialogViewController(MonoTouch.Dialog)的背景来解雇iPhone键盘吗?

可能重复:
MonoTouch.Dialog:通过触摸DialogViewController中的任何位置来解除键盘

我正在使用MonoTouch.Dialogs中的DialogViewController.我希望能够通过单击对话框的背景来关闭键盘.

我通常采用使用大型自定义按钮填充视图并将其放在所有其他元素后面的技术.但是,我不能在DialogViewController中使这个工作.我在LoadView中执行了此操作,它只是冻结了所有其他控件.

是否有一种相对直接的方式来实现我想要的?

keyboard xamarin.ios monotouch.dialog

8
推荐指数
1
解决办法
1156
查看次数

DialogViewController中断UINavigationController路径

我在DialogViewController向全局推送应用时遇到问题UINavigationController,它会丢失后退按钮.

我能够把它归结为这个简单的例子:

var nav = new UINavigationController();
window.RootViewController = nav;

nav.PushViewController(new UIViewController() { Title = "#1"}, true);
nav.PushViewController(new DialogViewController(new RootElement("#2")), true);
nav.PushViewController(new UIViewController() { Title = "#3"}, true);
Run Code Online (Sandbox Code Playgroud)

你可以从#3#2,但不能从#2#1.

我做错了DialogViewController吗?我虽然可以作为替代品的替代品UIViewController.

c# uinavigationcontroller xamarin.ios ios monotouch.dialog

8
推荐指数
1
解决办法
1347
查看次数

C#Xamarin/Monotouch.Dialog - EntryElement不显示输入的字符

我有一个Monotouch.Dialog EntryElement.

偶尔当我开始打字时,什么都没有出现......

光标不显示,如果我键入文本,则无法看到,但它会持久保存到EntryElement.Value属性中.

这个问题似乎只是在iPhone本身,而不是在iOS Simulator.我在跑iOS 6.3

有任何想法吗?Monotouch如果我无法获得一致的用户体验,这几乎可以为我解读.

c# xamarin.ios monotouch.dialog xamarin entryelement

8
推荐指数
1
解决办法
577
查看次数

Monotouch.Dialog - 点击了哪个元素

我有一个客户列表,我用它来创建像这样的元素:

Foreach(Customer c in Customers)
{
    //Make the StyledStringElement
    //Set the Tapped to action a touch
    element.Tapped += () => {  Push (new SomeController (c.ClientId)); };
}
Run Code Online (Sandbox Code Playgroud)

问题是,当点击元素时,它会将最后一个客户发送到SomeController().

如何设置Tapped Delegate包含将标记客户的信息

iphone xamarin.ios monotouch.dialog

7
推荐指数
1
解决办法
1450
查看次数

monotouch.dialog styledstringelement调整单元格宽度

我创建了一个类MyStyledStringElement和子类StyledStringElement和IElementSizing,试图控制一个styledstringelement的宽度.不幸的是,下面的代码只调整了getheight()中单元格的高度.是否有一个getWidth()方法,我可以使用或类似的东西来调整styledstringelement的宽度,使它看起来像一个UIButton?一如既往地提前感谢.

public override UITableViewCell GetCell (UITableView tv)
    {
        var cell = base.GetCell (tv);
        cell.AutosizesSubviews = false;
        //tv.TranslatesAutoresizingMaskIntoConstraints = false;
        cell.ClipsToBounds = false;
        cell.Frame.Width = 30;
        cell.Bounds.Width = 30;
        cell.Frame.Size = new System.Drawing.SizeF (30, 30);

        return cell;
    }


    #region IElementSizing implementation
    public float GetHeight (UITableView tableView, NSIndexPath indexPath)
    {
        //throw new NotImplementedException ();



        tableView.Frame.Width = 10;
        //tableView.Bounds.Width = 10;

        tableView.Frame.Height = 10;

        Console.WriteLine (tableView.ToString ());

        return 10;
    }
    #endregion
Run Code Online (Sandbox Code Playgroud)

c# xamarin.ios monotouch.dialog

7
推荐指数
1
解决办法
551
查看次数