2013-10-15 1 views
2

У меня есть статическая библиотека, которая содержит класс контроллера вида.Как открыть viewController изнутри статической библиотеки в Xcode?

Как на новом проекте в Xcode после включить статическую библиотеку (и заголовки) можно ли вызвать этот viewController?

Посмотреть контроллер на статической библиотеки:

#import "VC.h" 

@interface VC() 
    @property (nonatomic, strong) UILabel *label; 
    @property (nonatomic, strong) UIWindow *window; 
@end 


@implementation VC 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    _window.backgroundColor = [UIColor whiteColor]; 
    [self.view addSubview: _window]; 
    [super viewDidLoad]; 
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(115.0f, 150.0f, 200.0f, 30.0f)]; 
    self.label.text = @"hello world!"; 
    [self.view addSubview:self.label]; 
// Do any additional setup after loading the view. 
} 

@end 

Я попытался выделить это ViewController в новом проекте и назвать его ... но не работают:

VC *vc = [[VC alloc] init]; 
[self presentViewController:vc animated:YES completion:nil]; 

Могу ли я что-то отсутствует еще?

* UPDATE

После последнего редактирования, теперь я могу видеть ViewController, но это не на верхней части главного ViewController и он становится черным после того, как он загружает ... какие-нибудь мысли?

+0

Что вы пытались использовать VC? – Wain

+0

Что именно вы пытаетесь достичь? Вы хотите создать экземпляр объекта VC или что? Пожалуйста, уточните, что вы ожидаете. – RyanR

+0

Дополнительная информация добавлена ​​... –

ответ

-1

Мне не хватало элементарной структуры для контроллера вида.

Создание UIWindow внутри viewController устраняет проблему для меня.

Полный код Источника:

Статического вид библиотеки контроллер файл (VC.m):

#import "VC.h" 

@interface VC() 
    @property (nonatomic, strong) UILabel *label; 
    @property (nonatomic, strong) UIButton *button; 
    @property (nonatomic, strong) UIView *window; 
@end 

@implementation VC 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// CREATE UIVIEW INSIDE VIEW CONTROLLER 
    _window = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    _window.backgroundColor = [UIColor whiteColor]; 
// CREATE BUTTON TO CLOSE VIEW CONTROLLER AFTER IS SHOWN 
    _button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [_button addTarget:self action:@selector(closeWindow:) forControlEvents:UIControlEventTouchDown]; 
    [_button setTitle:@"Close View" forState:UIControlStateNormal]; 
    _button.frame = CGRectMake(115.0f, 150.0f, 200.0f, 30.0f); 
// ADD BUTTON TO THE UIWINDOW 
    [_window addSubview: _button]; 
// ADD UIWINDOW TO VIEW CONTROLLER 
    [self.view addSubview: _window]; 

    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Close ViewController 
- (IBAction)closeWindow:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

@end 

После импорта статической библиотеки и заголовков к новому приложению вы можете вызвать контроллер представления с IBAction например:

#import "VC.h" //header for viewcontroller code in static library 
... 
-(IBAction)callVC:(id)sender { 
    VC *vc = [[VC alloc] init]; 
    [self presentViewController:vc animated:YES completion:nil]; 
} 
+0

Привет, я пробовал ваш код, но я не могу видеть вид. Не могли бы вы помочь мне с ним? –

1

Существует несколько способов сделать это. Я бы сказал, что самый простой способ сделать это - просто включить ваш viewControllers .xib или storyBoard как файлы в папку с библиотекой. Если нет веских причин, по которым пользователи не могут получить доступ к этому, это не должно быть большой проблемой.

Другой способ сделать это - использовать universal framework, чтобы сделать вашу библиотеку. Это вернет вам два фреймворка, когда вы его скомпилируете, один с суффиксом .framework, а другой с суффиксом .embeddedframework. У последнего будут ссылки на ваши ресурсы.

Последний способ сделать это include it in your project as a bundle. Это несколько вовлеченный и неинтуитивный процесс по сравнению с вышеупомянутыми.

EDIT:

Если вы делаете это не с раскадровки или .xib файла вам нужно на самом деле Alloc и инициализации self.view. Он не загружается из раскадровки, поэтому вам нужно загрузить его самостоятельно. Это проблема с этим кодом.

+0

Hi Adam. Я бы предпочел сделать все, что в коде, если возможно, никакой раскадровки/xib. Благодарю. –

+0

А, в этом случае, что такое self.view со ссылкой на? Вам нужно фактически назначить и инициализировать представление для viewController и установить self.view равным ему. В противном случае в представлении ничего не появится. Если вы хотите проверить код примера, перейдите на страницу https://github.com/facebook/facebook-ios-sdk/blob/master/src/FBFriendPickerViewController.m и посмотрите, как они управляют табличным представлением. – AdamG

+0

Я изменил код ... теперь я могу выделить viewcontroller и увидеть его в приложении, но, похоже, он появился на обратной стороне, а после загрузки экрана становится черным ... кстати, спасибо за помощь. .. большие ресурсы. –

Смежные вопросы