iOS UIFont.ByName 异常(值不能为空。参数名称 : value)

标签 ios xamarin xamarin.ios

在自定义 Xamarin Forms iOS 渲染器中,我从文件中加载字体,当我到达 UIFont.FromName 时,它​​引发了如下所示的异常。 font var 是一个有效的 CGFont 实例,fontsize 是一个有效的 nfloat。有什么想法吗?

var font = CGFont.CreateFromProvider(fontDataProvider);
Control.Font = UIFont.FromName(font.FullName, (nfloat)e.NewElement.FontSize);

堆栈跟踪:

System.ArgumentNullException: Value cannot be null.
Parameter name: value
  at UIKit.UILabel.set_Font (UIKit.UIFont value) [0x00011] in /Users/builder/data/lanes/1381/3afb4af5/source/maccore/src/build/ios/native/UIKit/UILabel.g.cs:337 
  at DecryptRenderFont.iOS.DecryptRenderControlRenderer.OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e) [0x00215] 
  at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x00118] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000cc] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in <filename unknown>:0 
  at Xamarin.Forms.Platform.iOS.PageRenderer.ViewDidLoad () [0x0007d] in <filename unknown>:0 
  at (wrapper managed-to-native) ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr)
  at UIKit.UIViewController.get_View () [0x00030] in /Users/builder/data/lanes/1381/3afb4af5/source/maccore/src/build/ios/native/UIKit/UIViewController.g.cs:2667 

最佳答案

1 ) 我将假设您看到的异常堆栈没有显示实际的底层错误,因为它来自 Xamarin.iOS 生成的 UILabel.g.cs 文件(这是 https://github.com/xamarin/xamarin-macios 中自动生成的包装器),我个人在跟踪某些低级操作系统异常/抛出时遇到了一些问题,因此显示的异常有点(一个很多?)误导。

2) 我将再次假设,因为您说您“从文件加载字体”这些字体没有注册。假设您正在通过 CGFont.CreateFromProvider 从应用程序包中的文件(或动态下载)加载这些字体,并且由于它们不存在于 UIAppFonts 下的 info.plist 中键,它们不会自动注册到 iOS。您需要自己执行该步骤:

NSError error;
if (!CTFontManager.RegisterGraphicsFont(customFont, out error))
{
   // error occurred, checkout the contents of the NSError var
}

在使用 iOS 字体管理器 (CTFontManager) 注册 CGFont 之后,您实际上可以在 UIKit 中使用它们,否则在 iOS 代码中会出现异常...需要编写一些 ObjC/Swift 以在 Xcode 中检查它以查看抛出的实际错误是什么......

您的字体是否已注册:

在异常之前但在 CreateFromProvider 之后的某处,您可以执行以下操作:

foreach (var familyNames in UIFont.FamilyNames.OrderBy(c => c).ToList())
{
    D.WriteLine(" * " + familyNames);
    foreach (var familyName in UIFont.FontNamesForFamilyName(familyNames).OrderBy(c => c).ToList())
    {
        D.WriteLine(" *-- " + familyName);
    }
}

注意:D 只是using D = System.Diagnostics.Debug;

我敢打赌你的字体不在列表中,但在调用 CTFontManager.RegisterGraphicsFont 之后,它将在该列表中并且可以被 UIKit 使用.

更新:

有趣的是,使用基于 Swift 的应用程序并且不注册字体不会导致应用程序崩溃。字体当然没有显示,但通过 UIFont(name: "XXXXX", size: 35) 引用它只是一个无声的失败。

因此,为了安全起见,我建议围绕自定义字体的任何使用采取一些防御性的try{}catch{}

关于iOS UIFont.ByName 异常(值不能为空。参数名称 : value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968053/

相关文章:

ios - Swift:更改 TableView 标题文本颜色 - 崩溃

ios - 当之前的构建等待审核时,是否可以将构建提交到应用商店进行测试?

xamarin.ios - Xamarin/MonoTouch : Unable to compile in "Link SDK only" mode due to missing symbols

c# - WebRequest 将 URL 转换为 Xamarin 中的编码 (MonoTouch)

c# - 适用于移动应用程序 (Android/iOS) 的 Xamarin 中的 DataGridView

ios - 在 iOS Designer 中创建的代码中的访问约束

ios - 从 UILabel 中删除与文本重叠的图像部分

ios - CollectionViewController header 从屏幕边缘开始 Swift 4

c# - 您如何根据登录状态/角色限制/控制用户可以访问的导航路线?

xamarin - 图像大小,在 Xamarin Forms Labs 的图像按钮中的位置