2015-08-04 4 views
0

У меня есть некоторые проблемы, чтобы запустить приложение iOS с помощью xibs вместо раскадровки. Проблема в том, что im получает черный экран и первый контроллер представления не вызывается (добавлена ​​точка останова на метод viewDidLoad).запуск проекта ios без раскадровки

В заголовке приложения делегат я заявил об этом:

@property (strong, nonatomic) UIWindow window; 
@property (strong, nonatomic) ViewController *viewController; 

И в методе didFinishLaunchingWithOptions у меня есть эта реализация:

self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
navController.navigationBarHidden = YES; 

self.window.rootViewController = navController; 
[self.window makeKeyAndVisible]; 

Оглядываясь на некоторых форумах я обнаружил, что я должен быть allocing окна, поэтому я добавил это в качестве первой строки функции

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

Проблема в том, что, когда я это делаю, приложение выходит из строя после возврата из метода didFinishLaunchingWithOptions (SIGABRT без каких-либо следов).

Я также попытался сделать navController недвижимость, а также инстанцирование UIViewController класса по умолчанию initing того же XIB

Что я делаю неправильно?

Спасибо и привет

+0

ли вы удалить ссылку на 'основную' раскадровку внутри общих настроек вашей цели? – Jasper

+0

@ Jasper да, я удалил ссылку на раскадровку там, а также в 'info.plist'. Я также попытался добавить ViewController.xib к общим настройкам (не работал) – cobolero

+0

Насколько я вижу, вы все сделали правильно. Может быть, попробуйте очистить ваш проект или даже удалить ваши производные данные. – Jasper

ответ

1

ОК, наконец, я получил его.

Что я должен сделать, это просто добавить снова

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

После этого, просто удалите .h, .m и .xib и создать их снова.

По какой-либо причине его работа прекрасна.

+0

Странно!Тебе не обязательно это делать. Рад, что вы нашли свое решение как минимум. – Joze

+0

@Joze я согласен. Как бы то ни было, теперь он работает хехе. Если у вас есть эта проблема, попробуйте исправить ее таким образом. – cobolero

+0

Если кому-то интересно, здесь подробно описано, как это сделать с картинками. http://xcodenoobies.blogspot.my/2015/10/how-to-create-basic-single-view-project.html – GeneCode

-1

Это своего рода «из коробки» решение, так что это не имеет никакого отношения к вашему коду. Специально, потому что я не вижу ничего плохого в вашем коде.

У меня была такая же проблема, и я долго пытался исправить код, что сработало для меня - найти пример проекта (например, в github), который использует xibs.

Загрузите его, а затем отредактируйте, чтобы ваше приложение гарантировало работу. Жаль, что Xcode хочет заставить нас использовать свои раскадровки с такими проблемами.

+0

Почему downvote? Потому что причины? – Joze

+0

i didnt. Я собираюсь дать ему попробовать – cobolero

+2

Gotta love the mute downvoters. Если вы хотите уменьшить число минимумов, которые вы можете сделать, так это комментарий, чтобы я мог улучшить или просто удалить свой ответ, если это не подходит. – Joze

0

я не попытался с XIB, но эта вещь работает отлично здесь :::

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.viewController = [[ViewController alloc] init]; 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
    navController.navigationBarHidden = YES; 

    self.window.rootViewController = navController; 
    [self.window makeKeyAndVisible]; 
    // Override point for customization after application launch. 
    return YES; 
} 

и ViewController в viewDidLoad

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.view setBackgroundColor:[UIColor greenColor]]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

И зеленый цвет появляется на экране.

Инициализируйте окно перед настройкой контроллера корневого представления для окна.

Это единственная проблема, которую я вижу в вашем коде, поскольку rootViewController установлен в ничтожное окно, и после этого вы инициализируетесь.

+0

Здесь вы не используете указанный xib, и это именно то, что хочет OP. – Joze

+0

im делая это. Как я уже говорил, если я создаю экземпляр окна, приложение вылетает без какого-либо следа, а метод 'doneFinishLaunchingWithOptions' – cobolero

0

Чтобы изменить проект на использование xibs вместо раскадровки, создайте xib для каждого контроллера представления. Вам нужно будет изменить владельца файла на класс на контроллер вида, для которого создается xib. Затем подключите выход View Owner владельца файла к представлению в xib.

После этого выберите цель вашего приложения и измените раскрытие основного интерфейса на пустое. Теперь вы можете удалить файл раскадровки.

Наконец, инициализируйте свое окно в методе делегата application:didFinishLaunchingWithOptions: и установите в качестве контроллера корневого представления в качестве контроллера представления корневого каталога.Затем вызовите makeKeyAndVisible в окне вашего делегата приложения, и вам должно быть хорошо идти.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    self.window = [UIWindow new]; 
    self.window.rootViewController = [ViewController new]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

да, вот что я сделал. И его то, что терпит неудачу – cobolero

1
  1. Оставьте основной интерфейс пустой enter image description here

  2. Добавить новый ViewController.xib к проекту и отметьте класс владельца его файл как "ViewController" file's owner class as "ViewController"

  3. В AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    
    NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"ViewController" 
                    owner:nil 
                    options:nil]; 
    ViewController* vc = [xibContents objectAtIndex:0]; 
    UINavigationController *navigationController = 
        [[UINavigationController alloc] initWithRootViewController:vc]; 
    self.window.rootViewController = navigationController; 
    [self.window makeKeyAndVisible]; 
    
    return YES; 
    

    }

  4. строит и эксплуатируют

+0

содержание xib - это вид – cobolero

6

Надеется, что это поможет вам:

Удалить контроллер просмотра и раскадровку файлы и новый viewController.h, viewController.h.m, viewController.xib файл.

#import "AppDelegate.h" 

@interface AppDelegate() 

@end 

@implementation AppDelegate 
@synthesize viewCOntrollerobj; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.viewCOntrollerobj = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewCOntrollerobj]; 
    //navController.navigationBarHidden = YES; 

    self.window.rootViewController = navController; 
    [self.window makeKeyAndVisible]; 
    return YES; 

} 

enter image description here

+0

, раскадровка и ее ссылки уже удалены. Я опубликовал решение: просто удалите и создайте снова .h, .m и .xib – cobolero

0

В Swift 3.0

//MARK: Initial View Controller 
func initialViewController(){ 
    self.window = UIWindow(frame: UIScreen.main.bounds) 
    let rootViewController = UIViewController(nibName: "HomeVC", bundle: nil) 
    let navigation : UINavigationController = UINavigationController(rootViewController: rootViewController) 
    navigation.isNavigationBarHidden = true 
    self.window?.rootViewController = navigation 
    self.window?.makeKeyAndVisible() 
} 

в appdelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    initialViewController() 

    return true 
} 
Смежные вопросы