NSInvalidArgumentException,在 Monotouch 中抛出 Unrec

Posted

技术标签:

【中文标题】NSInvalidArgumentException,在 Monotouch 中抛出 Unrec【英文标题】:NSInvalidArgumentException, Unrec thrown in Monotouch 【发布时间】:2012-12-13 10:09:18 【问题描述】:

我面临的问题仅出现在几台测试设备中的一台设备上。所有设备均为 iPhone 4s ios 5.1.1,另一台为 iOS 6.0.1。

类似问题有多个答案,但没有一个包含这两种症状。

应用程序是用 Monotouch 编写的。

问题的症状是

应用程序不会改变受影响设备上的方向。 访问受影响设备上的某些视图时会引发 NSInvalidArgumentException。

完整的例外是:

Objective-C 抛出异常。名称:NSInvalidArgumentException 原因:-[UITableViewCell updateConstraintsIfNeeded]:无法识别的选择器发送到实例 0x4e07540

堆栈跟踪是

MonoTouch.Foundation.MonoTouchException: 抛出 Objective-C 异常。名称:NSInvalidArgumentException 原因:-[UITableViewCell updateConstraintsIfNeeded]:无法识别的选择器发送到实例 0x4c3cc20
  在 MonoTouch.UIKit.UIView.UpdateConstraintsIfNeeded () [0x00010] 在 /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.g.cs:1626
  在 XXXXXX.IOS.Dialogs.NewStyledMultilineElement.GetCell (MonoTouch.UIKit.UITableView tv) [0x0000f] 在 /Users/gavin/Perforce/Jon_PI-151_9051/XXXXXX/XXXXXX/v1.3.1/Mobile/XXXXXX/IOS/XXXXXX.Dialogs /我的工作/WorkDetailDialogController.cs:30
  在 MonoTouch.Dialog.DialogViewController+Source.GetCell (MonoTouch.UIKit.UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) [0x00029] 在 /Developer/MonoTouch/Source/MonoTouch.Dialog/MonoTouch.Dialog/DialogViewController.cs:340
  在 MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] 在 /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
  在 XXXXXX.IOS.Application.Application.Main (System.String[] args) [0x00000] 在 /Users/gavin/Perforce/Jon_PI-151_9051/Pall/XXXXXX/v1.3.1/Mobile/XXXXXX/IOS/XXXXXX.Application /Main.cs:28

导致异常的代码是

公共类 NewStyledMultilineElement : StyledMultilineElement

    公共覆盖 UITableViewCell GetCell (UITableView tv)
    
            UITableViewCell 单元格 = base.GetCell(tv);
            cell.SelectionStyle = UITableViewCellSelectionStyle.None;
            cell.UpdateConstraintsIfNeeded();
            返回单元格;
    

    公共NewStyledMultilineElement(字符串标题,字符串值):base(标题,值)
    
    

引发错误的行是 cell.UpdateConstraintsIfNeeded();

版本信息是

MonoDevelop 3.0.5 运行 单声道 2.10.9 GTK 2.24.10 XCode 4.5.1 单点触控 6.0.6

已将受影响设备上的设置与其他运行正常的设备进行了比较,没有明显差异。

症状可能针对不同的问题。但是,这是唯一抛出的接受。

任何帮助将不胜感激

进一步调查暂时解决了问题。然而,根本原因尚未得到证实。解决方法如下

为了解决方向问题,将以下代码添加到所有视图控制器都派生自的基本视图控制器中。

public override bool ShouldAutoRotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation) return true;

为了解决 NSInvalidArgumentException,我们使用 StyledMultilineElement 代替派生类。此问题可能是由 GC 引起的,但我们将不胜感激。

解决方案解决了问题,但没有确定根本原因。任何解释为什么仅在一台设备上而不是所有设备上都会发生这种情况都会有所帮助。

【问题讨论】:

【参考方案1】:

您正在使用 iOS6 的一项功能,即基于约束的布局。这在 iOS5 上不可用。因此,调用UpdateConstraintsIfNeeded() 将使运行在 iOS5.x 和更早版本的所有设备失败。

请参阅 Apple 的文档:http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/updateConstraints

updateConstraintsIfNeeded 更新接收的约束 视图及其子视图。

(void)updateConstraintsIfNeeded 讨论 每当为视图触发新的布局传递时,系统都会调用此方法以确保 视图及其子视图的任何约束都更新为 来自当前视图层次结构及其约束的信息。这 方法由系统自动调用,但可以调用 如果您需要检查最新的约束,请手动进行。

子类不应覆盖此方法。

可用性 适用于 iOS 6.0 及更高版本。在 UIView.h 中声明

【讨论】:

感谢您的回复。但是,我不能接受它作为答案,因为我拥有的 8 个测试设备都是 iOS 5.1.1,除了 1 个是 iOS 6.0.1。该应用程序仅在运行 5.1.1 的 1 台设备上失败。 您使用的是 iOS6 方法。没有什么可讨论的。也许它已经在 iOS5 中,但它可能不完整/损坏。但可以肯定的是:它不是供公众使用的。您是否使用受限布局?如果没有:只需删除呼叫。这不是必需的。 感谢您的意见。我已经删除了问题代码,它确实解决了这个问题。我不知道该方法可能是私有 API 或未完全实现。但是,这并不能解释为什么只有一个设备对代码做出错误反应,而其他设备则使用相同的操作系统功能。这是我急于解决的问题,因为它可能会影响部署测试所需的小时数。再次感谢您。

以上是关于NSInvalidArgumentException,在 Monotouch 中抛出 Unrec的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 作为参数传递 swift