Aracılığıyla paylaş


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 enumiçin bir (int) atama gerekebilir.

  • NSDictionary.IntValue şimdi bir nintdöndürür, bunun yerine kullanılabilecek bir Int32Value vardır.

  • nfloat ve nint türleri işaretlenemez const; static readonly nint makul bir alternatiftir.

  • Önceden doğrudan ad alanında MonoTouch. olan şeyler artık genel olarak ObjCRuntime. ad alanındadır (örneğin: MonoTouch.Constants.Version artık ObjCRuntime.Constants.Version).

  • Nesneleri seri hale getiren kod, ve nfloat türleri serileştirmeye nint ç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ü nfloatolarak 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.UnspecifiedDateTime dönüştürmeden önce yerel veya UTC'ye dönüştürmeyle ilgili hataları önlemek için NSDate.

  • 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şvuruda NSString.DrawString bulunabilir.

  • ile VideoSettings AVFoundation sınıflarını kullanan kod özelliğini kullanacak WeakVideoSettings şekilde değiştirilmelidir. Bu, ayarlar sınıflarında özellik olarak kullanılabilen bir Dictionarygerektirir, ö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 .NET Actionkullanılmıştır. Bazı basit (tek parametreli) temsilciler de ile Action<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.DialogDialog!

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 Foundationgerekir, ancak bazı durumlarda bunların el ile güncelleştirilmesi gerekir. Daha önce içinde MonoTouchUIKitbulunan 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 nfloatdeğ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 RectangleFCGRectolarak, CGSizeSizeF olarak ve PointFCGPointolarak 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 nintdeğiştirin. Bu genellikle , , NumberOfSections, TitleForHeaderGetHeightForRowGetViewForHeadervb. dahil olmak üzere RowsInSectionüzerindekiler UITableViewSourcegibi 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 nintdönüş değerini olarak nintdeğ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ı AddEllipseInRectdüzeltin. Diğer ad değişiklikleri şunlardır:

  • 'Color.Black' değerini olarak NSColor.Blackdeğiştirin.
  • MapKit 'AddAnnotation' değerini olarak AddAnnotationsdeğiştirin.
  • 'DataUsingEncoding' AVFoundation öğesini olarak Encodedeğiştirin.
  • 'AVMetadataObject.TypeQRCode' AVFoundation değerini olarak AVMetadataObjectType.QRCodedeğiştirin.
  • AVFoundation 'Video Ayarlar' olarak WeakVideoSettingsdeğiştirin.
  • PopViewControllerAnimated değerini olarak PopViewControllerdeğiştirin.
  • CoreGraphics 'CGBitmapContext.SetRGBFillColor' öğesini olarak SetFillColordeğ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);
    }
}