2011-04-27 36 views
0

这是一个初学者的关于目标规划的基本问题(至少我是这么认为的。):的Objective-C:乘对象

我有一个UIView的,想几个按钮添加到这个UIView的编程。有多少个按钮取决于用户输入。

每个按钮有四个特点:

  1. 它的编号(如按钮数一,二,三等)
  2. 其标题(如点击此,请点击这里,点击我等)
  3. 其位置和大小(即一的CGRect - 大小保持不变,只有y位置需要改变)
  4. 它的颜色(如红色,绿色,蓝色等)

现在我想我可以通过创建一个方法来创建一个按钮,但我不完全确定这是否是一个非常好的方法。我有这样的感觉,我应该创造一个对象。非常感谢任何有关我应该如何去做的帮助。这里是我的尝试 - 这是错误百出(比如,我不知道如何创建按钮1,按钮2等 - 因此按钮[B-号码]事):

-(void) createIndexButtonWithNumber:(NSString *)bNumber withTitle:(NSString *)bTitle atPosition:(NSInteger *)bPosition withColour:(NSInteger *)bColour { 

    CGRect buttonFrame = CGRectMake(0,bPosition,25,25); 
    UIButton* button[bNumber] = [[[UIButton alloc] initWithFrame:buttonFrame] autorelease]; 
    UIButton.text = bTitle; 
    if (bColour == 1) {UIButton.color = [UIColor colorWithRed:0.751 green:0.742 blue:0.715 alpha:1.000];}; 
    [indexView addSubview:button[bNumber]]; 

    // to do: if button[bNumber] pressed {do something}; 

} 

的话,就像通过调用“乘”对象三次:

for (temp = 0; temp < 2; temp++) { 
[self createIndexButtonWithNumber:temp withTitle:[@"Test%i", temp] atPosition:10 withColour:1];} 

我敢肯定,这是所有有点问题的,错误的,笨拙的,所以我是如何解决这个任何建议,非常感谢。

+0

不好意思,但是如果你用这种方法增加它们的话,按钮就不会完全一样。如果是这样,你可以将它们添加到一个数组中,以使它们得到完全相同的处理。 Sry如果这是主题:S – DailyDoggy 2011-04-27 20:41:36

回答

1

我想引用UIButton Class Reference

  1. 您应该创建按钮只能用buttonWithType:方法。

  2. 二,没有按钮颜色。您可以使用setTitleColor:forState:方法为标题设置颜色。

  3. 你的代码中只有语法错误(UIButton.text等)。你不能做这样的电话。 UIButton是一类。

  4. 您在for内调用createIndexButtonWithNumber...将按钮放在同一位置 - atPosition输入参数没有变化。变量不是指针 - *是不需要的。

  5. ...

在挣扎,我们结束还有水木清华这样的:

-(void)createIndexButtonWithNumber:(NSInteger)bNumber //(抱歉的是,一些麻烦与代码格式化)

      withTitle:(NSString *)bTitle 
         atPosition:(NSInteger)bPosition 
         withColour:(NSInteger)bColour { 
    CGRect buttonFrame = CGRectMake(0,bPosition,25,25); 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    button.frame = buttonFrame; 
    button.tag = bNumber; 
    [button setTitle: [NSString stringWithFormat:@"Button %i", bNumber] 
      forState:UIControlStateNormal]; 
    if (bColour == 1) { 
     [button setTitleColor:[UIColor colorWithRed:0.751 green:0.742 blue:0.715 alpha:1.000] 
        forState:UIControlStateNormal]; 
    }; 

    // you should pass to @selector a description like 'indexAction:' but NOT any calls like '[self indexAction:button]' 
    [button addTarget:self 
       action:@selector(indexAction:) 
    forControlEvents:UIControlEventTouchUpInside]; 
    [indexView addSubview:button]; 
} 

而且for电话:

for (int temp = 0; temp < 2; temp++) { 
    [self createIndexButtonWithNumber:temp withTitle:[@"Test%i", temp] atPosition:30 * temp withColour:1]; 
} 

更新:选择器方法

-(void)indexAction:(id)sender { 
    NSLog(@"Button with tag %d is pressed", ((UIButton *)sender).tag); 
} 
+0

非常感谢!特别是关于对文档的引用 - 我现在只是在阅读。但我必须说,我更喜欢你的解释。再次感谢。 – 2011-04-27 21:08:44

+0

很高兴知道它有帮助!请标记为已回答,如果是这样:) – knuku 2011-04-28 07:08:03

+0

只是一个后续问题:我试图给每个按钮分配相同的方法,但想要发送一个变量到该方法。这就是我的方法:' - (void)indexAction:(int *)buttonTag'这就是我试图给每个按钮分配这个方法的方法:'action:@selector([self indexAction:k])' (其中k是我在createIndexButton方法中分配的一个int ... [self indexAction:k]不起作用, – 2011-04-28 16:21:53

2

下面是一个简单的例子,我写了一个垂直创建5个按钮的行。唯一需要额外添加的是标签,如果需要的话,该标签将用于稍后参考按钮。

我建议阅读一些更多面向对象的程序示例。

float buttonPadding = 20; 
float buttonWidth = 80; 
float buttonHeight = 40; 
for (int k=0;k<5;k++) 
{ 
    UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btn.tag = 1000 + k; 
    btn.frame = CGRectMake(0, k*(buttonPadding+buttonHeight), buttonWidth, buttonHeight); 
    [btn setTitle:[NSString stringWithFormat:@"Button %i", k+1] forState:UIControlStateNormal]; 
    [self.view addSubview:btn]; 
} 
+0

谢谢!这比我尝试的更有意义......看例子是一回事 - 运用它们并将你所见到的实践变成另一回事。非常感谢您的帮助。 – 2011-04-27 20:51:29