在XCode中以编程方式创建出口和代码

时间:2011-08-11 14:31:30

标签: xcode4 interface-builder

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

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

我觉得乏味的是:

  1. 我必须为每个对象输入一个“标签”--100个标签
  2. 我必须将每个对象拖动到一个出口,在.h文件中生成如下代码:

    #import <UIKit/UIKit.h>
    @interface bbTestViewController : UIViewController {
        UIImageView *pop1;
        UIImageView *pop2;
        UIImageView *pop3;
        UIImageView *pop4;
        UIImageView *pop5;
        etc....
    

    对于50个控件以及以下代码:

    @property (nonatomic, retain) IBOutlet UIImageView *pop1;
    @property (nonatomic, retain) IBOutlet UIImageView *pop2;
    @property (nonatomic, retain) IBOutlet UIImageView *pop3;
    @property (nonatomic, retain) IBOutlet UIImageView *pop4;
    @property (nonatomic, retain) IBOutlet UIImageView *pop5;
    etc....
    

    为50个控件。

  3. 并在.m文件中:

        @synthesize pop1;
        @synthesize pop2;
        @synthesize pop3;
        @synthesize pop4;
        @synthesize pop5;
        etc.....
    

    这也增加了这样的行:          - (void)viewDidUnload         {

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

        - (void)dealloc {
            [pop1 release];
            [pop2 release];
            [pop3 release];
            [pop4 release];
            [pop5 release];
            etc.....
    

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

    我觉得这很乏味且反作用。根本不是RAD。更多SAD。如此重复同样的行动,这很痛苦。

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

    在其他语言中,我会使用For ... Each来遍历每个对象并做必要的事情。

    e.g。对于标签: 我会有代码来设置这样的标签:

        Integer n = 1;
        For Each oObject in myView
            oObject.tag = n
            n = n+1
        end for
    

    我可以使用代码来解决这些繁琐的

    过程
    1. 标签
    2. 声明每个对象并添加@property ...代码 添加@synthesize ...代码 将每个对象设置为nil 释放每个对象
    3. 以某种方式自动化从所有按钮到Action的连接。
    4. 我希望能够通过拖动来建立连接,在代码中完成所有这些操作,而不需要在IB for XCode 4中复制/粘贴所有内容或那些可重复的操作。

      这在XCode 4使用的MVC系统中是否可行?如果是这样,怎么样?

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

      看来如果你添加一个对象 - 比如一个按钮并与IB中的一个动作建立连接,那么如果你复制并粘贴那个按钮(或任何这样的对象),那么IB保留在我的情况下所做的连接,我创建按钮并建立与Action的连接,如果我复制并粘贴它,IB将为每个粘贴按钮建立相同Action的连接。至少这将节省一些时间。 HTH其他人。

3 个答案:

答案 0 :(得分:0)

你是对的,因为IB很糟糕。我非常希望Apple能够在XCode 4.x中做更多工作来修复它。

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

关于您当前的问题,请注意您可以在没有IB的情况下构建应用。您需要了解如何以编程方式构建控件并进行布局。我建议先查看Apple的示例代码。

我仍然建议对这50个按钮进行长时间的考虑。

答案 1 :(得分:0)

在视图控制器中执行:

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];
}

你应该没事。同样的图像......

答案 2 :(得分:0)

我在我的一个应用程序中使用了一种中途方法,我希望能够使用代码中的数组来处理网格中的按钮,就像你一样,我想设计外观和感觉在IB。

我做了你所做的事情,我将所有按钮放在视图上,然后为每个按钮声明一个ivar,@ property和@synhesize声明。因为它们像你所描述的那样处于一个网格中,我所做的是沿着button_1x1 button_1x2等的每一行命名(例如,如果你想到一个电子表格,就按行_xxc作为行x列。这些名字并不重要,因为你只会去在从viewDidLoad调用的方法中引用它们一次。

在那个方法中,我创建了一堆包含每个按钮的NSArrays。例如:

    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数组仅用于指示当显示更改透视时要隐藏的按钮 - 而不是移动它们我认为只是隐藏少数不适合的更快,并重新绘制它们。

对于界面构建器,请尝试:

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

然后,您将获得一个可用于连接视图对象的大面板。我喜欢使用这种方法,无论我连接的方向是什么 - 即如果你直接从对象拖动,你拖入的方向并不总是方便的。通过这种方式,您可以轻松查看所有插座。从我的角度来看,这更容易。

已经说过循环数组并分配目标或添加手势识别器/更新标题/颜色/任何你喜欢的东西都很容易。我想你也可以将它们存储在字典中(或者有一系列字典)。

我选择了一系列字典和上面看到的按钮数组。在界面翻转时,字典不会改变,但是数组中的按钮会被重新标记,因此任何将它们作为“发送者”的方法都可以通过索引到数据数组中立即获取字典数据

[myArray objectForIndex: ((UIButton*)sender).tag];

另一个技巧 - 在你尝试在IB中做任何事情之前构建cmd -b。这可以确保它选择刚刚编辑的内容或刚刚添加的文件。有时我不得不清理/构建强制图像出现在IB下拉列表中。它通常很不错,但如果你重命名一个图像文件,通常更容易从项目中删除它并再次将其拖入,构建(或清理构建)然后它应该是好的。