Xcode4 在XCode中以编程方式创建插座和代码

Xcode4 在XCode中以编程方式创建插座和代码,xcode4,interface-builder,Xcode4,Interface Builder,我发现在XCode 4中创建连接和其他可重复的东西非常乏味。这对我来说似乎不太好。让我解释一下 我有一个基于视图的iPad项目,只有一个视图。 视图上有大约50个按钮和50个UIImage对象-总共100个对象。所有UIImage对象都具有相同的图像。所有按钮都有相同的动作。每个按钮的标记确定要在操作中运行的代码 我觉得乏味的是: 我必须为每个对象键入一个“标记”-100个标记 我必须拖动每个对象以生成一个出口,该出口在.h文件中生成如下代码: #import <UIKit/UIKit.h

我发现在XCode 4中创建连接和其他可重复的东西非常乏味。这对我来说似乎不太好。让我解释一下

我有一个基于视图的iPad项目,只有一个视图。 视图上有大约50个按钮和50个UIImage对象-总共100个对象。所有UIImage对象都具有相同的图像。所有按钮都有相同的动作。每个按钮的标记确定要在操作中运行的代码

我觉得乏味的是:

  • 我必须为每个对象键入一个“标记”-100个标记
  • 我必须拖动每个对象以生成一个出口,该出口在.h文件中生成如下代码:

    #import <UIKit/UIKit.h>
    @interface bbTestViewController : UIViewController {
        UIImageView *pop1;
        UIImageView *pop2;
        UIImageView *pop3;
        UIImageView *pop4;
        UIImageView *pop5;
        etc....
    
    对于50个控件

  • 在.m文件中:

        @synthesize pop1;
        @synthesize pop2;
        @synthesize pop3;
        @synthesize pop4;
        @synthesize pop5;
        etc.....
    
    这还会添加如下行: -(无效)视图卸载 {

            [self setPop1:nil];
            [self setPop2:nil];
            [self setPop3:nil];
            [self setPop4:nil];
            [self setPop5:nil];
            etc.....
    

    3.然后,对于50个按钮中的每一个,我必须将它们拖动到同一个操作以建立连接,选择触摸操作,键入名称,然后单击“确定”

    我觉得这很乏味,而且适得其反。一点也不轻松。更令人悲伤。重复同样的动作太多了,这很痛苦

    所以问题是,有没有更简单的方法。我不相信复制/粘贴,所以解决方案是不可行的

    在其他语言中,我会使用For…Each来迭代每个对象并执行所需的操作

    e、 g.对于标签: 我需要代码来设置标签,如下所示:

        Integer n = 1;
        For Each oObject in myView
            oObject.tag = n
            n = n+1
        end for
    
    那么,我可以使用代码绕过这些繁琐的过程吗

  • 标签
  • 声明每个对象并添加@property…代码 添加@synthesis…代码 将每个对象设置为零 释放每个对象
  • 以某种方式自动实现从所有按钮到动作的连接
  • 我希望通过拖动来建立连接,能够在代码中完成所有这一切,而不需要所有复制/粘贴的东西,也不需要IB for XCode 4中那些可重复的操作

    这在XCode 4使用的MVC系统中是可能的吗?如果是,如何实现

    更新 经过一些研究,我发现我的问题至少有一个答案——关于行动的联系


    如果您添加了一个对象(比如一个按钮)并连接到IB中的一个操作,那么如果您复制并粘贴了该按钮(或任何此类对象),IB保留了所做的连接,因此在我上面的例子中,我创建了按钮并与动作建立了连接,如果我复制并粘贴它,IB将为每个粘贴的按钮与相同的动作建立连接。至少这将节省一些时间。HTH其他。

    关于IB糟糕透顶的一件事,你是对的。我对苹果抱有很高的希望我们在XCode 4.x中做了更多的工作来修复它

    但是我确实对你的界面感到好奇。在一个视图上有50个按钮似乎有点多。所以你可能想重构你项目的这一方面

    至于你目前的问题,请务必意识到,你可以在没有IB的情况下构建一个应用程序。你确实需要学习如何通过编程构建控件和布局。我建议先看看苹果的示例代码


    不过,我还是建议您仔细考虑一下这50个按钮。

    在视图控制器中:

    for (int i = 0; i < 50; i++) {
        UIButton *button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
        xpos = ...; // appropriate coordinate go here
        ypos = ...; // appropriate coordinate go here
        [button setFrame: CGRectMake(xpos, xpos, buttonWidth, buttonHeight)];
        [button addTarget: self action: @selector(myCoolAction:) forControlEvents: UIControlEventTouchUpInside];
        [button setTag: i];
        [[self view] addSubview: button];
    }
    
    for(int i=0;i<50;i++){
    UIButton*button=[UIButton button类型:UIButtonyPeroundRect];
    xpos=…;//适当的坐标转到这里
    ypos=…;//适当的坐标转到这里
    [按钮设置框:CGRectMake(xpos、xpos、按钮宽度、按钮宽度)];
    [按钮添加目标:自我操作:@selector(mycolaction:)for控制事件:UIControlEventTouchUpInside];
    [按钮设置标签:i];
    [[self view]添加子视图:按钮];
    }
    

    你应该很好。图像也是如此…

    我在我的一个应用程序中使用了一种中途之家的方法,我希望能够在代码中使用数组来寻址网格中的按钮,像你一样,我希望在IB中设计外观

    我做了你所做的事情,我把所有的按钮都放在视图上,甚至为每个按钮声明了一个ivar、@property和@synhessize声明。因为它们像你描述的那样在一个网格中,所以我所做的是按照button_1x1Button_1x2等的线条给每个按钮命名(如果您想到电子表格,请将button_rxc作为第x行列。名称并不重要,因为您在从viewDidLoad调用的方法中只会引用一次

    在该方法中,我创建了一组保存每个按钮的NSArray。例如:

        landscapeHidden = [[NSArray arrayWithObjects:
                           button_3x1, button_3x2,                  
                           button_4x1, button_4x2,                  
                           nil] retain];
    
        portraitHidden = [[NSArray arrayWithObjects:
                          button_1x3, button_1x4, 
                          button_2x3, button_2x4,
    
                          nil] retain];
    
    
        landscapeButtons = [[NSArray arrayWithObjects:
                            button_1x1, button_1x2, button_1x3, button_1x4, 
                            button_2x1, button_2x2, button_2x3, button_2x4, 
                            nil] retain];
    
    
    
    
        portraitButtons = [[NSArray arrayWithObjects:
                           button_1x1, button_1x2, 
                           button_2x1, button_2x2,  
                           button_3x1, button_3x2,  
                           button_4x1, button_4x2,
                           nil] retain];
    
    然后,每当我想通过编程迭代这些数组时,我都会使用它们

    _hidden数组只是用来指示当显示改变透视图时要隐藏哪些按钮,而不是将它们四处移动,我认为只隐藏少数不合适的按钮并重新绘制它们会更快

    对于interface builder,请尝试以下操作:

    按住control键并单击“文件的所有者”一次,然后等待

    然后你会得到一个大面板,你可以用它连接到视图对象。我更喜欢使用这种方法,不管我连接东西的方向是什么-也就是说,如果你直接从对象中拖动,拖动的方向并不总是很方便。这样你就可以一次轻松地查看所有插座。从我的个人电脑中可以轻松得多期待

    话虽如此,在数组中循环并指定目标或添加手势识别器/更新标题/颜色/任何你喜欢的东西都非常容易。我想你也可以将它们存储在字典中(或拥有一个字典数组)

    我使用了一个字典数组和上面看到的按钮数组。在界面翻转时,字典不会改变,但是数组中的按钮会被重新标记,因此任何将它们作为“发送者”的方法都可以通过使用

    [myArray objectForIndex: ((UIButton*)sender).tag];
    
    另一个诀窍是在你尝试在IB中做任何事情之前使用cmd-b build。这可以确保它拾取你刚刚编辑的内容,或者你刚刚添加的文件。有时我不得不清理/构建以强制图像显示在
        landscapeHidden = [[NSArray arrayWithObjects:
                           button_3x1, button_3x2,                  
                           button_4x1, button_4x2,                  
                           nil] retain];
    
        portraitHidden = [[NSArray arrayWithObjects:
                          button_1x3, button_1x4, 
                          button_2x3, button_2x4,
    
                          nil] retain];
    
    
        landscapeButtons = [[NSArray arrayWithObjects:
                            button_1x1, button_1x2, button_1x3, button_1x4, 
                            button_2x1, button_2x2, button_2x3, button_2x4, 
                            nil] retain];
    
    
    
    
        portraitButtons = [[NSArray arrayWithObjects:
                           button_1x1, button_1x2, 
                           button_2x1, button_2x2,  
                           button_3x1, button_3x2,  
                           button_4x1, button_4x2,
                           nil] retain];
    
    [myArray objectForIndex: ((UIButton*)sender).tag];