Warisan dari pengontrol tampilan dasar Objective-c dari Swift

Saya mencoba memigrasikan kelas UIViewController Objective-C ke Swift. Pengontrol tampilan ini mewarisi dari BaseViewController di mana saya memiliki fungsi umum yang ingin saya miliki di semua pengontrol. Masalah yang saya alami adalah myproject-Swift.h yang dihasilkan tidak dapat menemukan BaseViewController saya.

Apakah ada cara untuk mengimplementasikan UIViewController di Swift yang mewarisi dari BaseViewController (subkelas UIViewController) yang ditulis dalam Objective-C? Apakah ada masalah penghubung?

Itu dapat direproduksi dengan kode minimal ini:

BaseViewController.h

#import <UIKit/UIKit.h>

@interface BaseViewController : UIViewController 
@end

BaseViewController.m

import "BaseViewController.h"

@implementation BaseViewController
@end

ViewController.swift

import UIKit

class ViewController : BaseViewController {

}

AppDelegate.m

#import "AppDelegate.h"
#import "projectname-Swift.h"   // Replace with your project name

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

    return YES;
}

nama proyek-Bridging-Header.h

#import "BaseViewController.h"

person atxe    schedule 20.06.2014    source sumber
comment
Seperti apa header penghubung objek Anda?   -  person Nate Cook    schedule 20.06.2014
comment
@NateCook Diperbarui. Ini cukup sederhana.   -  person atxe    schedule 20.06.2014
comment
Memiliki bridging header saja tidak cukup, apakah sudah diatur dengan benar? Lihat stackoverflow.com/questions/24272184/   -  person Jack    schedule 20.06.2014
comment
@JackWu Saya kira begitu. Header disertakan dalam Objective-C Bridging Header.   -  person atxe    schedule 20.06.2014
comment
Menarik. Sepertinya Anda memiliki semua bagian yang diperlukan dalam format & lokasi yang tepat. ...Mungkin pertanyaan bodoh, tetapi apakah Anda benar-benar membangun/menjalankan proyek tersebut? Itu diperlukan untuk header .swift yang dihasilkan. Di suatu tempat di video WWDC Mengintegrasikan Dengan Objective-C ada juga yang menyebutkan penggunaan deklarasi penerusan @class, tapi saya tidak ingat secara spesifik di luar kepala saya...   -  person mc01    schedule 20.06.2014
comment
Saya membuat proyek tampilan tunggal dengan semua pengaturan ini dan berfungsi dengan baik - saya bahkan dapat mendeklarasikan properti di BaseViewController.h dan mengaksesnya di subkelas. Mungkin bug? Bisakah Anda mencoba membuat ulang proyek selangkah demi selangkah?   -  person Nate Cook    schedule 20.06.2014
comment
@ mc01 Ya, sudah dibuat. Dan ya, sepertinya ini terkait dengan urutan bagaimana setiap file sumber dibuat.   -  person atxe    schedule 23.06.2014
comment
@NateCook Saya mengulangi langkah-langkahnya dan saya mendapatkan kesalahan yang sama :-(   -  person atxe    schedule 23.06.2014


Jawaban (2)


Seperti yang ditunjukkan dalam jawaban yang diterima di Bagaimana cara menambahkan referensi kelas penerusan yang digunakan di header -Swift.h?

Panduan interoperabilitas (Mengimpor Swift ke Objective-C):

Jika Anda menggunakan tipe Objective-C Anda sendiri dalam kode Swift Anda, pastikan untuk mengimpor header Objective-C untuk tipe tersebut sebelum mengimpor header yang dihasilkan Swift ke file Objective-C .m tempat Anda ingin mengakses kode Swift.

Contohnya diselesaikan dengan mengimpor BaseViewController sebelum mengimpor projectname-Swift.h ke:

AppDelegate.m

#import "AppDelegate.h"
#import "BaseViewController.h"
#import "projectname-Swift.h"   // Replace with your project name
// ...
person atxe    schedule 23.06.2014

Sepertinya mereka telah memperbaiki masalahnya. Saat ini di bawah XCode6-Beta6 masalah yang dilaporkan oleh @atxe tidak terjadi lagi. Oleh karena itu, Anda akhirnya dapat mengembalikan header AppDelegate.m ke:

#import "AppDelegate.h"
#import "projectname-Swift.h"   // Replace with your project name
person Mr Spiegel    schedule 20.08.2014