2013-03-28 1 views
1

Все больше и больше я вижу преимущество создания всех представлений в коде, и я надеюсь полностью переключиться на этот стиль dev. И поскольку название подсказывает, что я некоторые незначительные осложнения. Как обычно, я уверен, что это то, что я просто не замечаю. Взгляните на мой код, можете ли вы предложить предложение? ARC включен.Приложение iOS, в котором нет нищих, проблема с выходом из-под земли

Что происходит, метод -(id)init; возвращает nil, когда я проверяю его в делегате приложения, и я не могу понять, почему ... вызов self = [super init]; всегда работает, но не в этом случае.

main.m:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([BCAppDelegate class])); 
    } 
} 

в BCAppDelegate.m:

@implementation BCAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.backgroundColor = [UIColor whiteColor]; 

    BCViewController *bcv = [[BCViewController alloc] init]; 

    if (bcv == nil) { printf("it's nil\n"); } 

    UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [view setBackgroundColor:[UIColor blueColor]]; 
    [bcv setView:view]; 

    [self.window setRootViewController:bcv]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

BCViewController.h:

@interface BCViewController : UIViewController <UIImagePickerControllerDelegate> 
{ 
    /*some IVARS*/ 
} 

-(id)init; 

@end 

в BCViewController.m:

@implementation BCViewController 

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

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { return nil; } 

-(id)init 
{ 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 
    return self; 
} 

- (void)loadView 
{ 
    /* No Code yet */ 
} 
+0

Поместите контрольную точку в этом 'initWithNibName: пачке:' метод, который вы только что написали. Вы должны увидеть что-то интересное. –

+0

Нет необходимости реализовывать 'initWithNibName: bundle:' вообще. Я делаю все в коде, и у меня нет такого метода ни в одном из моих контроллеров. – rmaddy

+0

Почему вы создаете представление для контроллера вида в делегате приложения? Пусть диспетчер представлений обработает свое собственное представление. Это его работа. Кроме того, не оставляйте 'loadView' так, как у вас есть. Я почти никогда не реализую его сам. Но наличие пустой реализации не позволяет контроллеру представления создавать собственное представление. – rmaddy

ответ

4
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    return nil; 
} 

Не делай этого. Это назначенный инициализатор UIViewController. Вы нарушаете функциональность этого класса. Верните результат вызова super (возможно, с некоторыми дополнительными инициализациями) или вообще не реализуйте этот метод.

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

Читайте, читайте, читайте документацию! Он рассказывает вам, каковы ваши обязанности. Читайте и слушайтесь. Работайте с картой и для нее, не атакуйте и не подрывайте рамки.

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

http://www.apeth.com/iOSBook/ch19.html#_manual_view

+0

Я сначала вернул [super init], и он ввел поток в бесконечный цикл, поэтому я удалил этот метод вместе и проблема решена. Благодаря! Почему это так? – achi

+0

Я решил сохранить переопределение другого метода init, потому что я хотел удалить возможность даже использовать наконечник. Я, должно быть, что-то пропустил, когда прочитал документацию. – achi

+0

'- [super init]' calls '-initWithNibName: nil bundle: nil', конечно, он рекурсивно – CodaFi