推送 UIViewController 失败并显示"Application tried to push a nil view controller on target"



所以我使用一个NavigationController来做我的iOS App的所有导航。在主屏幕上有一个'加号按钮'来拍摄图像,在按下这个按钮时,NavigationController用'displayCamera:'方法推送'CameraViewController'。在那里用户可以拍摄一个图像它应该被另一个UIViewController预览它被功能'picTaken:'推入。然而,随着时间的推移,我试图推这个视图控制器,我得到错误"应用程序试图推一个nil视图控制器上的目标"。我不知道哪里出了问题。下面是NavigationController.h和相应的.m文件


NavigationController.h

#import <UIKit/UIKit.h>
#import "CameraViewController.h"
#import "MainViewController.h"
#import "PictureCheckViewController.h"
@interface NavigationController : UINavigationController {
    CameraViewController *camView;
    MainViewController *mainView;
    PictureCheckViewController *checkView;
}
- (void)displayCamera:(id)sender;
- (void)picTaken:(id)sender;
@end

NavigationController.m

#import "NavigationController.h"
@interface NavigationController () {
}
@end
@implementation NavigationController
- (void)viewDidLoad
{
    [super viewDidLoad];
    camView = [[CameraViewController alloc] init];
    mainView = [[MainViewController alloc] init];
    checkView = [[PictureCheckViewController alloc] init];
}
 - (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)displayCamera:(id)sender {
    [self pushViewController:camView animated:YES];
}
- (void)picTaken:(id)sender {
    [self pushViewController:checkView animated:YES];
}
@end

如果您需要更多的信息,请告诉我。

感谢你的时间和帮助

我建议您使用延迟实例化方法。添加一个属性:

@Property(nonatomic,strong) MainViewController *mainView;
@Property(nonatomic,strong) PictureCheckViewController *checkView;

和自己重写getter:

-(MainViewController*) mainView {
    if(!_mainView) {
        _mainView = [[MainViewController alloc] init];
    }
    return _mainView;
}

对于checkView也是如此。

-(PictureCheckViewController*) checkView {
    if(!_checkView) {
        _checkView = [[PictureCheckViewController alloc] init];
    }
    return _checkView;
}

然后使用:

访问
self.checkView
self.mainView

我相信除了解决你的问题,它还可以避免创建,除非资源实际使用

最新更新