2013-08-28 32 views
1

我試圖創建NSMutableAttributedString並使用SetProperties方法設置其屬性。但是我的應用程序錯誤死機,CTFont與CTStringAttributes和NSMutableAttributedString在xamarin中崩潰我的應用程序

MonoTouch.Foundation.MonoTouchException exception - NSInvalidArgumentException Reason: unrecognized selector sent to instance 0xc305d00.* 

代碼:

var richTask = new NSMutableAttributedString ("Random"); 
var fda = new CTFontDescriptorAttributes { 
    FamilyName = "Courier", 
    StyleName = "Bold", 
    Size = 18f 
}; 
var fd = new CTFontDescriptor (fda); 
var font = new CTFont (fd, 0); 

var attrs = new CTStringAttributes { Font = font }; 
var range = new NSRange (0, 3); 
richTask.SetAttributes(attrs, range); 

_label.AttributedText = richTask; 

此代碼是在UITableViewControllerGetCell方法。我想只能改變字符串的前3-4個字母的字體或顏色。

我想通了,如果我消除字體組件,並設置另一個屬性,例如,StrokeWidth,它工作正常

var attrs = new CTStringAttributes { /*Font = font*/ StrokeWidth = 5f }; 

如此看來,字體初始化有點不正確。這是爲什麼?爲什麼它會崩潰我的應用程序?

感謝您的提前!

+0

我有同樣的問題,並使用(我認爲)'UIStringAttribute'來代替。當我開始工作時,讓我發佈一個代碼示例。 – jonathanpeppers

+0

我試圖在一個簡單的程序中重現這個bug,但是我得到了預期的輸出(字體和全部)。請提供完整的repro。 –

回答

3

下面是使用UIStringAttributes代替的例子:

 string line1 = "Don't have Facebook?", line2 = "\nCreate or sign in with an alternate account"; 
     var attributedString = new NSMutableAttributedString(line1 + line2); 

     attributedString.SetAttributes(new UIStringAttributes 
     { 
      Font = Theme.BoldSmallFont, 
      ForegroundColor = Theme.LightGray, 

     }.Dictionary, new NSRange(0, line1.Length)); 

     attributedString.SetAttributes(new UIStringAttributes 
     { 
      Font = Theme.RegularSmallFont, 
      ForegroundColor = Theme.LightGray, 

     }.Dictionary, new NSRange(line1.Length, line2.Length)); 

     _alternateSignIn.SetAttributedTitle(attributedString, UIControlState.Normal); 

這是對UIButton設置兩個不同的字體的實例。 Theme是我自己的靜態類,你可以用你自己的顏色和字體替換。

您應該能夠用UIStringAttributes完成同樣的事情,與CTStringAttributes一樣。你可能會發佈一個錯誤報告給Xamarin,以防你的情況崩潰:http://bugzilla.xamarin.com

*注意:屬性字符串只適用於iOS 6和更高版本。這是蘋果添加這些API的時候。

+0

非常好!完美的作品。非常感謝你。 – Semuserable