gpt4 book ai didi

iphone - 覆盖 InputAccessoryView 时未调用模态视图析构函数

转载 作者:行者123 更新时间:2023-11-29 13:49:37 25 4
gpt4 key购买 nike

我正在以模态方式呈现一个 UIViewController,该 View 包含各种 UITextFields。我已经重写了模态视图 InputAccessoryView,以便它显示一个简单的 View ,每个 UITextField 都有一个按钮 ResignFirstResponder,从而消除了键盘。

最近我一直在努力解决与内存相关的问题,所以我所有的 Controller 现在都有一个析构函数。我注意到,每当键盘显示这个覆盖 InputAccessoryView 时,只要模态视图被关闭,析构函数就不会被调用。这是否意味着 UIViewController 没有被销毁?我是否错误地显示了 InputAccessoryView?

InputAccessoryView代码如下:

bool accessoryViewInit = false;
UIView accessoryView = new UIView(new RectangleF(0,0,320,30));

public override UIView InputAccessoryView
{
get
{
if (!accessoryViewInit)
{
accessoryView.BackgroundColor = UIColor.FromRGBA(0.0f, 0.0f, 0.f, 0.5f);
UIButton dismiss = new UIButton(new RectangleF(50,1, 200, 28));
dismiss.BackgroundColor = UIColor.Blue;
dismiss.SetTitle("Close Keyboard", UIControlState.Normal);
dismiss.TouchUpInside += delegate(object sender, EventArgs e) {
field1.ResignFirstResponder();
field2.ResignFirstResponder();
field3.ResignFirstResponder();
};
accessoryView.AddSubview(dismiss);
}
return accessoryView;
}
}

我有一种感觉,因为我正在为按钮的 TouchUpInside 事件分配一个委托(delegate),它是否保留对此的引用,从而阻止整个 Controller 被破坏?

我创建了一个示例项目,可以在 https://github.com/lukewhitt/InputAccessoryView-test 找到

要重现问题:运行应用程序,通过触摸大红色按钮显示模态视图。现在,如果您在不显示键盘的情况下关闭 View ,将调用析构函数。如果您在 UITextField 的第一响应器(显示键盘和 InputAccessoryView)上进行操作,然后关闭模态 Controller ,则不会调用析构函数。

编辑

这似乎是 Monotouch 中的一个错误,将在即将发布的版本中修复。为了解决这个问题,您似乎不能在分配给事件时使用匿名委托(delegate)。所以 dismiss.TouchUpInside 会变成:

public override UIView InputAccessoryView {
// code before
dismiss.TouchUpInside += HandleDismissTouch;
// rest of code
}

private void HandleDismissTouch (object sender, EventArgs e)
{
field1.ResignFirstResponder();
field2.ResignFirstResponder();
field3.ResignFirstResponder();
}

然后在关闭模态 Controller 的代码中,我添加了以下内容:

if (dismiss != null)
{
dismiss.TouchUpInside -= HandleDismissTouch;
dismiss.Dispose();
dismiss = null;
}

这导致析构函数被调用!

最佳答案

我认为您在 MT 中遇到了一个错误,该错误将在 MT 4 中修复。看起来事件处理程序可能会阻止释放 Controller :

UIView events and garbage collection

不幸的是,Geoff 没有回答后续发帖人的问题,这有什么影响,以及使用匿名代表参加事件是否是 MT4 之前的问题。

我认为目前有效的解决方案是手动 Dispose()。

关于iphone - 覆盖 InputAccessoryView 时未调用模态视图析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com