iphone - iOS 应用程序没有使用 nib,无法启动

标签 iphone ios objective-c memory-management viewcontroller

我越来越看到在代码中创建所有 View 的好处,并希望完全切换到这种开发风格。正如标题所示,我遇到了一些小问题。像往常一样,我确信这是我几乎没有忽略的东西。看看我的代码,你能提供一个建议吗? ARC 已启用。

发生的是 -(id)init;当我在应用程序委托(delegate)中检查它时,方法返回 nil,我似乎无法弄清楚为什么...... self = [super init]; call 似乎总是有效,但在这种情况下不是。

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 */
}

最佳答案

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


不要那样做。这是 UIViewController 的指定初始化器。你破坏了这个类的功能。返回调用super的结果(可能有一些额外的初始化)或者根本不实现这个方法。

要完全在代码中生成 View Controller 的 View ,请实现 loadView .就这样。同样,不要以你正在做的方式实现它!如果您实现 loadView你必须创建一个 UIView 并设置 self.view给它。

阅读,阅读,阅读文档!它告诉你你的责任是什么。阅读并服从。使用并为框架工作,不要攻击或颠覆框架。

这是我书中的一部分,展示了如何使用 View Controller 而不是 nib 来启动应用程序:

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

关于iphone - iOS 应用程序没有使用 nib,无法启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672189/

相关文章:

iphone - 如何使用 Objective C 将日志写入文本文件以进行调试?

ios - 在 iOS 中编写 "phone"应用程序

ios - 给定一个 View ,我如何获得它的 viewController?

ios - iPhone 6 和 6 plus 屏幕像素大小?

ios - 在模拟器中运行代码时一切正常,但在手机上运行时则不然

ios - 在 View Controller 之间传递多个数据

objective-c - 在 Objective-C 中,Java 的 "instanceof"关键字的等价物是什么?

objective-c - Cocoapods 框架中的 Swift 扩展导致无法识别的选择器发送到类

iphone - 您能否要求 iPhone 3G(或更新版本)具有build设置?

iphone - 如何从 GCDAsyncUdpSocket 初始化和实例化