NSInvalidArgumentException,在Monotouch中抛出Unrec

时间:2012-12-13 10:09:19

标签: ios5 xamarin.ios

我遇到的问题仅在几个测试设备中的一个设备上抛出。所有设备都是iPhone 4s iOS 5.1.1,另一台设备是iOS 6.0.1。

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

该应用程序是用Monotouch编写的。

问题的症状是

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

完整的例外是:

Objective-C exception thrown.  Name: NSInvalidArgumentException Reason: -[UITableViewCell updateConstraintsIfNeeded]: unrecognized selector sent to instance 0x4e07540

堆栈跟踪

MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown.  Name: NSInvalidArgumentException Reason: -[UITableViewCell updateConstraintsIfNeeded]: unrecognized selector sent to instance 0x4c3cc20
  at MonoTouch.UIKit.UIView.UpdateConstraintsIfNeeded () [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.g.cs:1626
  at XXXXXX.IOS.Dialogs.NewStyledMultilineElement.GetCell (MonoTouch.UIKit.UITableView tv) [0x0000f] in /Users/gavin/Perforce/Jon_PI-151_9051/XXXXXX/XXXXXX/v1.3.1/Mobile/XXXXXX/IOS/XXXXXX.Dialogs/My Work/WorkDetailDialogController.cs:30
  at MonoTouch.Dialog.DialogViewController+Source.GetCell (MonoTouch.UIKit.UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) [0x00029] in /Developer/MonoTouch/Source/MonoTouch.Dialog/MonoTouch.Dialog/DialogViewController.cs:340
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
  at XXXXXX.IOS.Application.Application.Main (System.String[] args) [0x00000] in /Users/gavin/Perforce/Jon_PI-151_9051/Pall/XXXXXX/v1.3.1/Mobile/XXXXXX/IOS/XXXXXX.Application/Main.cs:28

导致异常的代码是

public class NewStyledMultilineElement : StyledMultilineElement
{
    public override UITableViewCell GetCell (UITableView tv)
    {
            UITableViewCell cell = base.GetCell(tv);
            cell.SelectionStyle = UITableViewCellSelectionStyle.None;
            cell.UpdateConstraintsIfNeeded();
            return cell;
    }

    public NewStyledMultilineElement(string caption, string value) :base(caption,value)
    {
    }
}

抛出错误的行是 cell.UpdateConstraintsIfNeeded();

版本信息是

MonoDevelop 3.0.5 运行   单声道2.10.9   GTK 2.24.10 XCode 4.5.1 Monotouch 6.0.6

受影响设备上的设置已与其他按预期运行的设备相比较,没有明显差异。

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

非常感谢任何帮助

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

要解决方向症状,请将以下代码添加到从中查看所有视图控制器的基本视图控制器。

public override bool ShouldAutoRotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation) { return true; }

要解决NSInvalidArgumentException,已使用StyledMultilineElement而不是派生类。这个问题可能是由GC引起的,但是可以理解它的变化。

解决方案可以解决问题,而无需确定根本原因。任何探索为什么只在一台设备上发生这种情况并不是所有设备都会有所帮助。

1 个答案:

答案 0 :(得分: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中声明