1

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

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

主.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 */
}
4

1 回答 1

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

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

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

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

这是我书中的一部分,展示了如何使用视图控制器而不是 nib 来启动应用程序:

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

于 2013-03-28T00:38:11.920 回答