Pertanyaan Menangani delegasi aplikasi dan beralih antar tampilan


Saya mendapatkan peringatan tentang masalah semantik yang berkaitan dengan lulus *const _strong mengetik id dan sepertinya tidak dapat memperbaikinya tidak peduli apa yang saya ubah.

Saya memiliki dua pandangan saat ini, dan telah menulis kode ini. Di iPadSpeckViewController.m, di sini adalah metode yang harus beralih di antara tampilan:

-(IBAction) touchProducts {
    ProductsViewController *controller = [[ProductsViewController alloc]
            initWithNibName:@"Products" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    controller.delegate = self;
    [self presentModalViewController:controller animated:YES];
}

Dan untuk ProductViewController.h:

@interface ProductsViewController : UIViewController {
    id<ProductsViewControllerDelegate> delegate;
}
@property(nonatomic, retain)
    IBOutlet id<ProductsViewControllerDelegate> delegate;

ProductsViewController.m berisi:

@synthesize delegate;

Tapi pandangannya tidak berubah ... Pikiran?

EDIT: Berikut adalah peringatan yang tepat, seperti yang muncul pada baris "controller.delegate = self;" di iPadSpeckViewController.m:

/Developer/iPadSpeckApp/iPadSpeckApp/iPadSpeckAppViewController.m:17:27:{17:27-17:31}: warning: passing 'iPadSpeckAppViewController *const __strong' to parameter of incompatible type 'id<ProductsViewControllerDelegate>' [3]

29
2018-06-15 21:58


asal


Jawaban:


Peringatan ini anehnya kata, tetapi sebenarnya hanya cara memberitahu Anda bahwa kelas diri (apa pun kelas itu) gagal menyesuaikan dengan protokol ProductViewControllerDelegate. Untuk menyingkirkan peringatan, Anda memiliki dua pilihan:

  • Deklarasikan kelas diri (apa pun kelas itu), di dalam kelasnya @interface pernyataan, agar sesuai dengan protokol ProductViewControllerDelegate:

    @interface MyClass : NSObject <ProductsViewControllerDelegate>;
    
  • Tunda peringatan dengan mengubah ini:

    controller.delegate = self;
    

    untuk ini:

    controller.delegate = (id)self;
    

Properti delegasi diketik sebagai id<ProductsViewControllerDelegate>. Tetapi diri tidak. Di bawah ARC Anda harus membuat para pemain secara eksplisit, sehingga tipe-tipe tersebut secara resmi setuju. (Saya percaya ini adalah agar ARC dapat benar-benar memastikan bahwa ia memiliki informasi yang cukup untuk membuat keputusan manajemen memori yang tepat.)


152
2017-10-30 23:44



Mengalami kesalahan yang sama ketika saya mencoba menetapkan delegasi dari UINavigationController ke objek yang menerapkan protokol yang salah (UINavigationBarDelegate, bukan UINavigationControllerDelegate). Ini mungkin salah ketik sederhana.


0
2017-10-23 15:26



Jika Anda hanya ingin beralih tampilan, Anda mungkin ingin mencoba kode di bawah ini. Ini bekerja untukku.

ProductsViewController *controller = [[ProductsViewController alloc] initWithNibName:@"Products" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

Saya menggunakan itu untuk memiliki menu utama saya di aplikasi saya beralih ke permainan.

Jika Anda ingin animasi khusus (saya pikir saya melihat Cross Disolize?), Namun, saya tidak tahu. Saya akan mencoba menggali melalui dokumentasi untuk melihat, dan saya akan memberi tahu Anda apa yang saya temukan.

Adapun "* const_string to type id", meskipun saya tidak tahu apa yang Anda coba lakukan dengan aplikasi Anda, saya pikir masalahnya adalah id <ProductsViewControllerDelegate> delegate dalam pengontrol tampilan Anda.


-1
2018-06-15 22:13