Xcode4 在XCode中以编程方式创建插座和代码
我发现在XCode 4中创建连接和其他可重复的东西非常乏味。这对我来说似乎不太好。让我解释一下 我有一个基于视图的iPad项目,只有一个视图。 视图上有大约50个按钮和50个UIImage对象-总共100个对象。所有UIImage对象都具有相同的图像。所有按钮都有相同的动作。每个按钮的标记确定要在操作中运行的代码 我觉得乏味的是:Xcode4 在XCode中以编程方式创建插座和代码,xcode4,interface-builder,Xcode4,Interface Builder,我发现在XCode 4中创建连接和其他可重复的东西非常乏味。这对我来说似乎不太好。让我解释一下 我有一个基于视图的iPad项目,只有一个视图。 视图上有大约50个按钮和50个UIImage对象-总共100个对象。所有UIImage对象都具有相同的图像。所有按钮都有相同的动作。每个按钮的标记确定要在操作中运行的代码 我觉得乏味的是: 我必须为每个对象键入一个“标记”-100个标记 我必须拖动每个对象以生成一个出口,该出口在.h文件中生成如下代码: #import <UIKit/UIKit.h
#import <UIKit/UIKit.h>
@interface bbTestViewController : UIViewController {
UIImageView *pop1;
UIImageView *pop2;
UIImageView *pop3;
UIImageView *pop4;
UIImageView *pop5;
etc....
对于50个控件 @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
那么,我可以使用代码绕过这些繁琐的过程吗
如果您添加了一个对象(比如一个按钮)并连接到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];