我可以在xCode中创建一个随机视图控制器的按钮链接吗?

时间:2012-05-05 12:28:39

标签: objective-c xcode ipad random ios-simulator

我在这方面很新......抱歉提前。我在xCode中创建了一个包含10个View控制器的应用程序。每个视图控制器都有一个图像视图和一个圆形矩形按钮。

我想设置它,以便按下视图上的按钮将转移到其他9个视图中的一个,但加载视图需要是随机的。

到目前为止我做了什么:

- 我在故事板上放置了10个视图控制器,并将每个视图控制器的类设置为scene1-10

-I创建了名为scene1-10的10个Objective-C类-ViewControllers(.h和.m文件)

- 我在这个时尚场景1中创建了它们之间的分段 - > scene2 - > scene3 - > scene4    - >添加标题SCENE5 - > scene6 - > 7scene - > scene8 - > scene9 - > scene10 - > SCENE1

- 我已经将每个segue的类设置为segue1-10,在它们前进的场景之后命名它们   to(scene1和scene2之间的segue将是segue2)

-I使所有.h文件看起来像这样(场景#根据文件而改变):

#import <UIKit/UIKit.h>

@interface scene1 : UIViewController

- (IBAction) randomButton;

@end

-I使所有.m文件看起来像这样(场景#根据视图而改变

#import "scene1.h"

@interface scene1 ()

@end

@implementation scene1

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction) randomButton : (id) sender
{
    int i = arc4random() % 10;
    if(i == 1)
    {
        [self performSegueWithIdentifier: @"segue1" 
                                  sender: self];
    }
    else if(i == 2)
    {
        [self performSegueWithIdentifier: @"segue2" 
                              sender: self];
    }
    else if(i == 3)
    {
        [self performSegueWithIdentifier: @"segue3" 
                                  sender: self];
    }
    else if(i == 4)
    {
        [self performSegueWithIdentifier: @"segue4" 
                                  sender: self];
    }
    else if(i == 5)
    {
        [self performSegueWithIdentifier: @"segue5" 
                                  sender: self];
    }
    else if(i == 6)
    {
        [self performSegueWithIdentifier: @"segue6" 
                                  sender: self];
    }
    else if(i == 7)
    {
        [self performSegueWithIdentifier: @"segue7" 
                                  sender: self];
    }
    else if(i == 8)
    {
        [self performSegueWithIdentifier: @"segue8" 
                                  sender: self];
    }
    else if(i == 9)
    {
        [self performSegueWithIdentifier: @"segue9" 
                                  sender: self];
    }
    else
    {
        [self performSegueWithIdentifier: @"segue10" 
                                  sender: self];
    }
}
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end

-I链接收到的操作&#34; randomButton&#34;为每个视图控制器列出视图控制器上的按钮

会发生什么:

我得到了一个&#34;不完整的实施&#34;警告&#34; @implementation scene1&#34;每个.m文件的行,但应用程序确实构建并加载。

一旦加载,如果我按下按钮,应用程序会冻结,xCode的调试窗口会弹出以下内容:

2012-05-05 07:11:11.789 randomTester[2448:f803] -[scene1 randomButton]: unrecognized                     selector sent to instance 0x686d370
2012-05-05 07:11:11.792 randomTester[2448:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[scene1 randomButton]: unrecognized selector sent to instance 0x686d370'
*** First throw call stack:
(0x13cc022 0x155dcd6 0x13cdcbd 0x1332ed0 0x1332cb2 0x13cde99 0x1914e 0x190e6 0xbfade 0xbffa7 0xbed8a 0x3e2cf 0x3e5e6 0x24dc4 0x18634 0x12b6ef5 0x13a0195 0x1304ff2 0x13038da 0x1302d84 0x1302c9b 0x12b57d8 0x12b588a 0x16626 0x1f5d 0x1ec5)
terminate called throwing an exception(lldb)

我意识到我可能完全错了。我已经搜索了所有但无法找到我需要的东西,所以我不得不拼凑相似代码中的位。

感谢您宝贵的时间和帮助!



更新

好的,第二轮:

你们真棒,我没有意识到我已经通过声明和IBAction的实施做到了这一点。这解决了所有实施错误。但是,我似乎有一个潜在的问题。

我的.h文件现在看起来像这样:

#import <UIKit/UIKit.h>

@interface scene1 : UIViewController

- (IBAction) randomButton;

@end

我的.m苍蝇现在看起来像这样:

#import "scene1.h"

@interface scene1 ()

@end

@implementation scene1

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)randomButton
{
    int i = arc4random() % 10 + 1;
    NSString *segueIdentifier = [NSString stringWithFormat:@"segue%d", i];
    [self performSegueWithIdentifier:segueIdentifier sender:self];

}- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end

没有实现错误并且构建正常但是当我按下按钮时应用程序冻结并且xCode的调试窗口弹出以下内容:

2012-05-05 13:00:09.236 randomTester[2699:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:     'Receiver (<scene1: 0x6868f90>) has no segue with identifier 'segue5''
*** First throw call stack:
(0x13cb022 0x155ccd6 0xdd61b 0x2592 0x13cce99 0x1814e 0x180e6 0xbeade 0xbefa7 0xbdd8a 0x3d2cf 0x3d5e6 0x23dc4 0x17634 0x12b5ef5     0x139f195 0x1303ff2 0x13028da 0x1301d84 0x1301c9b 0x12b47d8 0x12b488a 0x15626 0x224d 0x21b5)
terminate called throwing an exception(lldb) 

很明显App正在查看scene1视图控制器而没有看到&#34; segue5&#34; (这是新IBAction调用的随机区域)。这是因为scene1视图控制器上没有segue5,因为它只有一个segue转到scene2,如上面问题的第一部分所述。

为了尝试解决这个问题,我在scene1上用segue1-10类创建了10个segue。我将segues 2-10分别连接到场景2-10。似乎合乎逻辑的是按钮可以随机调用segue1,因此指向自身。由于我无法创建从scene1到scene1的segue,我创建了第二个segue到scene2,并给它一个segue1类。

没有错误和应用程序加载但按下按钮导致应用程序冻结此时间在调试中显示:

2012-05-05 13:45:04.467 randomTester[2803:f803] -[scene1 randomButton:]: unrecognized selector sent to instance 0x68b3760
2012-05-05 13:45:04.479 randomTester[2803:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:     '-[scene1 randomButton:]: unrecognized selector sent to instance 0x68b3760'
*** First throw call stack:
(0x13cb022 0x155ccd6 0x13cccbd 0x1331ed0 0x1331cb2 0x13cce99 0x1814e 0x180e6 0xbeade 0xbefa7 0xbdd8a 0x3d2cf 0x3d5e6 0x23dc4     0x17634 0x12b5ef5 0x139f195 0x1303ff2 0x13028da 0x1301d84 0x1301c9b 0x12b47d8 0x12b488a 0x15626 0x224d 0x21b5)
terminate called throwing an exception(lldb) 

问题一: 任何想法如何设置这些细分以使其工作?

问题二: 会不会更好:

使用图像视图和按钮

创建名为scene1-10的10个视图控制器

- 设置每个按钮,启动一个segue到名为sceneRandomizer的第11个视图控制器   (我不会给这些赛段课程)

-Connect 10来自sceneRandomizer的段落返回场景1-10   (课程将是segue1-10)

- 编写&#34; sceneRandomizer&#34;自动启动1-10的随机segue   组很像一个重定向(我不知道怎么写那个....只是扔掉那里)

理论上,这将减轻我遇到的第二个错误,在调用它的视图控制器上调用了segue。

如果这种替代设置能够起作用,那么会产生从一个segue到另一个这样的另一个显着滞后吗?




更新

它现在正在工作

终于有了这个工作。它似乎是一个&#34; round-about&#34;方法,我确信有一个更有效和可接受的方法来做到这一点,但这就是我做的:

.h和.m中的代码与上次尝试的代码相同,但我只是要重申它:

我的.h文件如下所示:

#import <UIKit/UIKit.h>

@interface scene1 : UIViewController

- (IBAction) randomButton;

@end

我的.m文件如下所示:

#import "scene1.h"

@interface scene1 ()

@end

@implementation scene1

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)randomButton
{
    int i = arc4random() % 10 + 1;
    NSString *segueIdentifier = [NSString stringWithFormat:@"segue%d", i];
    [self performSegueWithIdentifier:segueIdentifier sender:self];

}- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

@end

我做的不同:

好的,这一次 - 我将11个视图控制器拖到故事板上

  • 我命名了一个&#34; startPage&#34;并将其他人命名为#34; scene1-10&#34;

  • 我创建了1 .h和一个.m文件(如上所示编码)并命名为StartPage.h和
    StartPage.m

  • 我将故事板上所有11个视图的类设置为一个视图控制器(StartPage)

  • 我制作了10个segues,1个从StartPage到10个场景中的每一个然后

  • 我从场景1中制作了10个segues,1个从scene1到其他9个场景中的每个场景,并给了他们segue2-10类(以他们去的场景命名)
    注意
    因为我无法从scene1到scene1创建一个segue,所以我从scene1到scene2创建了第二个segue,并简单地给了它一个segue1类。

  • 我为其他9个场景重复了最后一步

这确实有效。它构建并运行没有错误。 StartPage首先出现。点击按钮将加载组中的随机视图(scene1-10),然后点击结果视图上的按钮将随机加载组中的另一个视图,依此类推。

这样做的不利方面是设置所有segue所需的时间。这个故事板现在有110个segues控制只有11个视图之间的移动。 .....这是我生命中的一小时,我永远无法回来。

对于像我这样的新手:

如果您选择使用此方法,请在命名您的segue标识符时小心非常。让我们说你为场景5布置了segues你错误地命名了2 segues segue2而忘了命名一个segue3。如果最终用户在scene5上并且随机按钮调用segue3,则应用程序将崩溃,因为scene5没有名为segue3的segue。我只提到这一点,因为在测试过程中发现这样的错误可能非常困难,因为一切看起来都很好,除非它恰好在你在场景5时调用segue3。

如果有人发现使用这种方法有任何弊端,我一点也不知道,请提出来。如果你有一个更好的方法,我全都耳朵:)

3 个答案:

答案 0 :(得分:2)

错误&amp;编译器警告告诉你,即使你说你实现randomButton,你实际上并没有。

您正在实施

-(void)randomButton:(id)sender;-(void)randomButton;

不同

两种不同的签名。让任何一方与另一方相匹配,它应该可以解决。

答案 1 :(得分:1)

方法randomButton的声明和实现应该具有相同的签名。所以,你应该在.h文件中声明它:

- (IBAction)randomButton:(id)sender;

.m文件中将其更改为:

- (IBAction)randomButton
{
    int i = arc4random() % 10;
    // ...
}

作为旁注,您可以使用i的值生成segue标识符来简化代码:

- (IBAction)randomButton
{
    int i = arc4random() % 10 + 1;
    NSString *segueIdentifier = [NSString stringWithFormat:@"segue%d", i];
    [self performSegueWithIdentifier:segueIdentifier sender:self];
}

另请注意,我更改了生成i的行,以生成从110的值。您的原始代码会生成从09的值。

答案 2 :(得分:0)

我曾经使用来自单个父级的模态viewControllers来做这样的事情。按下按钮会告诉parentView dismissModalViewController,然后在父视图的viewWillAppear中生成一个随机数和pushModalViewController。我用xib做了所有这些,所以我不确定如何使用模态segues来实现它。如果你想出来,请告诉我们。