Kodu Unified API’ye Güncelleştirmeye İlişkin İpuçları
Eski Xamarin çözümlerini Birleşik API'ye güncelleştirirken aşağıdaki hatalarla karşılaşılabilir.
NSInvalidArgumentException Görsel Taslak Bulunamadı Hatası
Geçerli Mac için Visual Studio sürümünde projenizi Birleştirilmiş API'lere dönüştürmek için otomatik geçiş aracı kullanıldıktan sonra oluşabilecek bir hata var. Güncelleştirmeden sonra, formda bir hata iletisi alırsanız:
Objective-C exception thrown. Name: NSInvalidArgumentException Reason: Could not find a storyboard named 'xxx' in bundle NSBundle...
Bu sorunu çözmek için aşağıdakileri yapabilir, aşağıdaki derleme hedef dosyasını bulabilirsiniz:
/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/lib/mono/2.1/Xamarin.iOS.Common.targets
Bu dosyada aşağıdaki hedef bildirimi bulmanız gerekir:
<Target Name="_CopyContentToBundle"
Inputs = "@(_BundleResourceWithLogicalName)"
Outputs = "@(_BundleResourceWithLogicalName -> '$(_AppBundlePath)%(LogicalName)')" >
Ve özniteliğini DependsOnTargets="_CollectBundleResources"
ekleyin. Böyle:
<Target Name="_CopyContentToBundle"
DependsOnTargets="_CollectBundleResources"
Inputs = "@(_BundleResourceWithLogicalName)"
Outputs = "@(_BundleResourceWithLogicalName -> '$(_AppBundlePath)%(LogicalName)')" >
Dosyayı kaydedin, Mac için Visual Studio yeniden başlatın ve projenizin temiz ve yeniden derlemesini yapın. Bu soruna yönelik bir düzeltme kısa süre içinde Xamarin tarafından yayınlanmalıdır.
Yararlı İpuçları
Geçiş aracını kullandıktan sonra, el ile müdahale gerektiren bazı derleyici hataları almaya devam edebilirsiniz. El ile düzeltilmesi gerekebilecek bazı şeyler şunlardır:
Karşılaştırmak
enum
için bir(int)
atama gerekebilir.NSDictionary.IntValue
şimdi birnint
döndürür, bunun yerine kullanılabilecek birInt32Value
vardır.nfloat
venint
türleri işaretlenemezconst
;static readonly nint
makul bir alternatiftir.Önceden doğrudan ad alanında
MonoTouch.
olan şeyler artık genel olarakObjCRuntime.
ad alanındadır (örneğin:MonoTouch.Constants.Version
artıkObjCRuntime.Constants.Version
).Nesneleri seri hale getiren kod, ve
nfloat
türleri serileştirmeyenint
çalışırken bozulabilir. Geçiş sonrasında serileştirme kodunuzun beklendiği gibi çalıştığından emin olun.Bazen otomatikleştirilmiş araç koşullu derleyici yönergelerinin içindeki
#if #else
kodu kaçırır. Bu durumda düzeltmeleri el ile yapmanız gerekir (aşağıdaki yaygın hatalara bakın).kullanarak
[Export]
el ile dışarı aktarılan yöntemler, geçiş aracı tarafından otomatik olarak düzeltilmeyebilir, örneğin bu kod snippert içinde dönüş türününfloat
olarak el ile güncelleştirmeniz gerekir:[Export("tableView:heightForRowAtIndexPath:")] public nfloat HeightForRow(UITableView tableView, NSIndexPath indexPath)
Birleştirilmiş API, kayıpsız bir dönüştürme olmadığından NSDate ile .NET DateTime arasında örtük bir dönüştürme sağlamaz. .NET'i
DateTimeKind.Unspecified
DateTime
dönüştürmeden önce yerel veya UTC'ye dönüştürmeyle ilgili hataları önlemek içinNSDate
.Objective-C kategori yöntemleri artık Birleşik API'de uzantı yöntemleri olarak oluşturulur. Örneğin, daha önce kullanılan
UIView.DrawString
kod artık Birleşik API'de başvurudaNSString.DrawString
bulunabilir.ile
VideoSettings
AVFoundation sınıflarını kullanan kod özelliğini kullanacakWeakVideoSettings
şekilde değiştirilmelidir. Bu, ayarlar sınıflarında özellik olarak kullanılabilen birDictionary
gerektirir, örneğin:vidrec.WeakVideoSettings = new AVVideoSettings() { ... }.Dictionary;
NSObject
.ctor(IntPtr)
oluşturucu ortak olan korumalı olarak değiştirildi (yanlış kullanımı önlemek için).NSAction
yerine standart .NETAction
kullanılmıştır. Bazı basit (tek parametreli) temsilciler de ileAction<T>
değiştirilmiştir.
Son olarak, kodunuzda API'lerde yapılan değişiklikleri aramak için Klasik v Birleşik API farklılıklarına bakın. Bu sayfada arama yapmak, Klasik API'leri ve güncelleştirildikleri api'leri bulmanıza yardımcı olur.
Not
Geçiş MonoTouch.Dialog
sonrasında ad alanı aynı kalır. Kodunuz MonoTouch.Dialog kullanıyorsa, bu ad alanını kullanmaya devam etmelisiniz- olarak değiştirmeyin MonoTouch.Dialog
Dialog
!
Yaygın Derleyici Hataları
Yaygın hatalara ilişkin diğer örnekler, çözümle birlikte aşağıda listelenmiştir:
Hata CS0012: 'MonoTouch.UIKit.UIView' türü, başvurulmayan bir derlemede tanımlanır.
Düzeltme: Bu genellikle projenin Birleşik API ile derlenmemiş bir bileşene veya NuGet paketine başvurduğunu gösterir. Tüm Bileşenleri ve NuGet paketlerini silip yeniden eklemeniz gerekir. Bu hata düzeltilmezse, dış kitaplık henüz Birleşik API'yi desteklemeyebilir.
Mt0034 Hatası: Aynı Xamarin.iOS projesine hem 'monotouch.dll' hem de 'Xamarin.iOS.dll' eklenemiyor - 'Xamarin.iOS.dll' açıkça başvurulurken ,'monotouch.dll' 'Xamarin.Mobile, Version=0.6.3.0, Culture=neutral, PublicKeyToken=null' tarafından başvuruldu.
Düzeltme: Bu hataya neden olan bileşeni silin ve projeye yeniden ekleyin.
Hata CS0234: 'Foundation' türü veya ad alanı adı 'MonoTouch' ad alanında yok. Eksik bir derleme başvurunuz mu var?
Düzeltme: Mac için Visual Studio'deki otomatik geçiş aracının tüm MonoTouch.Foundation
başvurularını güncelleştirmesi Foundation
gerekir, ancak bazı durumlarda bunların el ile güncelleştirilmesi gerekir. Daha önce içinde MonoTouch
UIKit
bulunan gibi diğer ad alanları için de benzer hatalar görünebilir.
Hata CS0266: 'double' türü örtük olarak 'System.float' türüne dönüştürülemiyor
Düzeltme: türünü ve atamasını olarak nfloat
değiştirin. Bu hata, 64 bit eşdeğerleri olan diğer türler için de oluşabilir (örneğin nint
, )
nfloat scale = (nfloat)Math.Min(rect.Width, rect.Height);
Hata CS0266: 'CoreGraphics.CGRect' türü örtük olarak 'System.Drawing.RectangleF' türüne dönüştürülemiyor. Açık bir dönüştürme var (atamanız eksik mi?)
Düzeltme: örneklerini RectangleF
CGRect
olarak, CGSize
SizeF
olarak ve PointF
CGPoint
olarak değiştirin. Ad alanı using System.Drawing;
ile using CoreGraphics;
değiştirilmelidir (henüz yoksa).
hata CS1502: 'CoreGraphics.CGContext.SetLineDash(System.nfloat, System.nfloat[])' için en iyi aşırı yüklenmiş yöntem eşleşmesinin bazı geçersiz bağımsız değişkenleri var
Düzeltme: Dizi türünü olarak nfloat[]
değiştirme ve açıkça atama Math.PI
.
grphc.SetLineDash (0, new nfloat[] { 0, 3 * (nfloat)Math.PI });
Hata CS0115: 'WordsTableSource.RowsInSection(UIKit.UITableView, int)' geçersiz kılma olarak işaretlendi ancak geçersiz kılmak için uygun bir yöntem bulunamadı
Düzeltme: Dönüş değerini ve parametre türlerini olarak nint
değiştirin. Bu genellikle , , NumberOfSections
, TitleForHeader
GetHeightForRow
GetViewForHeader
vb. dahil olmak üzere RowsInSection
üzerindekiler UITableViewSource
gibi yöntem geçersiz kılmalarında oluşur.
public override nint RowsInSection (UITableView tableview, nint section) {
Hata CS0508: WordsTableSource.NumberOfSections(UIKit.UITableView)
geçersiz kılınan üyeyle eşleşmesi için dönüş türü 'System.nint' olmalıdır UIKit.UITableViewSource.NumberOfSections(UIKit.UITableView)
Düzeltme: Dönüş türü olarak değiştirildiğinde nint
dönüş değerini olarak nint
değiştirin.
public override nint NumberOfSections (UITableView tableView)
{
return (nint)navItems.Count;
}
Hata CS1061: 'CoreGraphics.CGPath' türü 'AddElipseInRect' için tanım içermiyor
Düzeltme: için yazım hatalarını AddEllipseInRect
düzeltin. Diğer ad değişiklikleri şunlardır:
- 'Color.Black' değerini olarak
NSColor.Black
değiştirin. - MapKit 'AddAnnotation' değerini olarak
AddAnnotations
değiştirin. - 'DataUsingEncoding' AVFoundation öğesini olarak
Encode
değiştirin. - 'AVMetadataObject.TypeQRCode' AVFoundation değerini olarak
AVMetadataObjectType.QRCode
değiştirin. - AVFoundation 'Video Ayarlar' olarak
WeakVideoSettings
değiştirin. - PopViewControllerAnimated değerini olarak
PopViewController
değiştirin. - CoreGraphics 'CGBitmapContext.SetRGBFillColor' öğesini olarak
SetFillColor
değiştirin.
'MapKit.MKAnnotation.Coordinate' geçersiz kılınabilir bir küme erişimcisi (CS0546) olmadığından CS0546: geçersiz kılınamıyor hatası
MKAnnotation'ı alt sınıflandırarak özel bir ek açıklama oluştururken Koordinat alanında ayarlayıcı yoktur, yalnızca bir alıcı vardır.
Düzeltme
- Koordinatı izlemek için alan ekleme
- Koordinat özelliğinin alıcısında bu alanı döndür
- SetCoordinate yöntemini geçersiz kılma ve alanınızı ayarlama
- Geçirilen koordinat parametresiyle ctor'unuzda SetCoordinate'ı çağırın
Şunun gibi görünmelidir:
class BasicPinAnnotation : MKAnnotation
{
private CLLocationCoordinate2D _coordinate;
public override CLLocationCoordinate2D Coordinate
{
get
{
return _coordinate;
}
}
public override void SetCoordinate(CLLocationCoordinate2D value)
{
_coordinate = value;
}
public BasicPinAnnotation (CLLocationCoordinate2D coordinate)
{
SetCoordinate(coordinate);
}
}