Наследование от базового контроллера представления Objective-c от Swift

Я пытаюсь перенести класс UIViewController Objective-C на Swift. Этот контроллер представления наследуется от BaseViewController, где у меня есть общие функции, которые я хочу иметь во всех контроллерах. У меня проблема в том, что сгенерированный myproject-Swift.h не может найти мой BaseViewController.

Есть ли способ реализовать UIViewController в Swift, который наследуется от BaseViewController (подкласс UIViewController), написанного на Objective-C? Есть ли проблема с мостом?

Его можно воспроизвести с помощью этого минимального кода:

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;
}

имя_проекта-Bridge-Header.h

#import "BaseViewController.h"

person atxe    schedule 20.06.2014    source источник
comment
Как выглядит ваш заголовок моста objc?   -  person Nate Cook    schedule 20.06.2014
comment
@NateCook Обновлено. Это довольно просто.   -  person atxe    schedule 20.06.2014
comment
Недостаточно просто иметь соединительный заголовок, правильно ли он настроен? См. stackoverflow.com/questions/24272184/   -  person Jack    schedule 20.06.2014
comment
@JackWu Думаю, да. Заголовок включен в заголовок моста Objective-C.   -  person atxe    schedule 20.06.2014
comment
Интересно. Похоже, у вас есть все необходимые детали в правильном формате и месте. ...Может глупый вопрос, но действительно ли вы создавали/запускали проект? Это необходимо для сгенерированного заголовка .swift. Где-то в видеоролике WWDC Integrating With Objective-C также упоминалось об использовании форвардного объявления @class, но я не припоминаю никаких подробностей...   -  person mc01    schedule 20.06.2014
comment
Я создал проект с одним представлением со всеми этими настройками, и он отлично работал — я даже мог объявить свойство в BaseViewController.h и получить к нему доступ в подклассе. Может баг? Можете ли вы попробовать воссоздать проект шаг за шагом?   -  person Nate Cook    schedule 20.06.2014
comment
@ mc01 Да, он построен. И да, похоже, это связано с порядком построения каждого исходного файла.   -  person atxe    schedule 23.06.2014
comment
@NateCook Я повторил шаги, и у меня была та же ошибка :-(   -  person atxe    schedule 23.06.2014


Ответы (2)


Как указано в принятом ответе на Как я могу добавить прямые ссылки на класс, используемые в заголовке -Swift.h?

Руководство по совместимости (импорт Swift в Objective-C):

Если вы используете свои собственные типы Objective-C в своем коде Swift, обязательно импортируйте заголовки Objective-C для этих типов перед импортом сгенерированного заголовка Swift в файл Objective-C .m, из которого вы хотите получить доступ к коду Swift.

Пример решается путем импорта BaseViewController перед импортом projectname-Swift.h в:

AppDelegate.m

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

Похоже, они исправили проблему. В настоящее время в XCode6-Beta6 проблема, о которой сообщает @atxe, больше не возникает. Поэтому вы можете, наконец, вернуть заголовок AppDelegate.m обратно:

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