Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 按下ViewController会产生NSInvalidArgumentException_Ios - Fatal编程技术网

Ios 按下ViewController会产生NSInvalidArgumentException

Ios 按下ViewController会产生NSInvalidArgumentException,ios,Ios,我是一名新的iOS开发者,最近开发了几个Android应用程序,但我不熟悉iOS术语。让我解释一下我的问题 我想使用两种不同的UIViewController。我已经为这两个控制器创建了.h和.m文件。我的计划是在第一个视图控制器出现在屏幕上五秒钟后,将secont视图控制器推到第一个视图控制器的顶部。我的意思是第一个视图控制器类似于闪屏或类似的东西 这是我的贡献。在第一个视图控制器中,我定义了(其中一个当然实现了)以下两种方法: -(void) pushSecondController {

我是一名新的iOS开发者,最近开发了几个Android应用程序,但我不熟悉iOS术语。让我解释一下我的问题

我想使用两种不同的
UIViewController
。我已经为这两个控制器创建了
.h
.m
文件。我的计划是在第一个视图控制器出现在屏幕上五秒钟后,将secont视图控制器推到第一个视图控制器的顶部。我的意思是第一个视图控制器类似于闪屏或类似的东西

这是我的贡献。在第一个视图控制器中,我定义了(其中一个当然实现了)以下两种方法:

-(void) pushSecondController {
    SecondViewController *secondController = [[SecondViewController alloc]
                                              initWithNibName: nil
                                              bundle: NULL];
    [self.navigationController pushViewController: secondController animated: YES];
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self performSelector: @selector(pushViewController:animated:)
                withObject: nil
                afterDelay: 5.0f];
}
第二个视图控制器如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"Second Controller";
}
我只更改了
viewDidLoad
方法。当我运行模拟器时,first view控制器运行良好,等待了5秒后崩溃。输出如下所示:

2012-08-24 10:46:34.104 NavApplication[20355:f803] -[ViewController pushViewController:]: unrecognized selector sent to instance 0x6e7f780
2012-08-24 10:46:34.107 NavApplication[20355:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController pushViewController:]: unrecognized selector sent to instance 0x6e7f780'
让我再问一个问题:我知道
methodName
methodName:
之间有区别。有人能解释一下有什么不同吗

任何帮助都将不胜感激

更新:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    [self.window makeKeyAndVisible];
    [self.window addSubview: self.navigationController.view];
    return YES;
}

@选择器(pushViewController:animated:)
更改为
@选择器(pushSecondController)
如上所述,您可能希望将
性能选择器
命令更改为:

[self performSelector: @selector(pushSecondController)
            withObject: nil
            afterDelay: 5.0f];
因为您希望它调用您的
pushSecondController
方法,而不是
pushViewController:animated:

关于第二个问题:
methodName
methodName:
之间的区别在于
方法名:
末尾的
表示此方法采用参数。因此,您可以使用以下方法:

- (void)listItems
{
    // ...
}

- (void)insertItem:(NSDictionary *)item
{
    // ...
}
将对它们的引用传递到
@selector
中时,对于第一种方法,您只需执行
@selector(listItems)
,因为它不带参数;对于后者,您只需执行
@selector(insertItem:)
,因为它带参数

更新

刚刚看到您的
应用程序idLaunch
代码。您可能希望重新安排内容,以便将
ViewController
添加到
UINavigationController
,然后将
UINavigationController
设置为窗口的rootViewController。像这样:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

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

    self.window.rootViewController = self.navigationController;

    [self.window makeKeyAndVisible];
    return YES;
}

请将您的didFinishLaunchingWithOptions方法更改为:

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];

            self.window.rootViewController = self.navigationController;

            [self.window makeKeyAndVisible];

            return YES;
    }

您是否自行设置self.navigationController?你能从App Delegate发布你的didFinishLaunchingWithOptions方法吗?更新了我的问题,如我所见,我设置了
navigationController
。首先,谢谢你。我已更改并收到此错误:
'NSInvalidArgumentException',原因:'-[ViewController-pushViewController]:未识别的选择器发送到实例
。我猜您将其更改为
@selector(pushViewController)
,而不是
@selector(pushSecondController)
?是的,您是对的。我漏掉了那个愚蠢的打字错误。再次感谢你,现在它起作用了。詹姆斯,回答得很好。现在我已经接近这么宽了。但很抱歉,我已经接受了答案,我没有足够的代表投票。无论什么时候,我都会立即投票。谢谢!我想你可以不接受一个答案而接受另一个?