我发现在XCode 4中创建连接和其他可重复的东西非常繁琐。这对我来说似乎不是RAD。让我解释一下
我有一个基于View的iPad项目,只有一个视图。 在视图上有大约50个按钮和50个UIImage对象 - 总共100个对象。所有UIImage对象都具有相同的图像。所有按钮都具有相同的动作。每个按钮的标记确定要在Action中运行的代码。
我觉得乏味的是:
我必须将每个对象拖动到一个出口,在.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个控件。
并在.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
我可以使用代码来解决这些繁琐的
过程我希望能够通过拖动来建立连接,在代码中完成所有这些操作,而不需要在IB for XCode 4中复制/粘贴所有内容或那些可重复的操作。
这在XCode 4使用的MVC系统中是否可行?如果是这样,怎么样?
更新 经过一些研究后,我发现至少有一个问题答案 - 关于与行动的联系。
看来如果你添加一个对象 - 比如一个按钮并与IB中的一个动作建立连接,那么如果你复制并粘贴那个按钮(或任何这样的对象),那么IB保留在我的情况下所做的连接,我创建按钮并建立与Action的连接,如果我复制并粘贴它,IB将为每个粘贴按钮建立相同Action的连接。至少这将节省一些时间。 HTH其他人。
答案 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下拉列表中。它通常很不错,但如果你重命名一个图像文件,通常更容易从项目中删除它并再次将其拖入,构建(或清理构建)然后它应该是好的。