【问题标题】:Creating UI elements programmatically in Objective-C在 Objective-C 中以编程方式创建 UI 元素
【发布时间】:2015-05-15 18:13:18
【问题描述】:

我一直致力于自动化创建 UI 元素的某些方面,并创建了这种似乎有效的方法:

    - (void) viewDidLoad
        {
            [super viewDidLoad];
            button = [self createButton:button xPos:30 yPos:100 width:100 height:30  caption:@"autoButton" textPos:NSTextAlignmentCenter textClr:[UIColor blackColor] backClr:[UIColor yellowColor]];
            [self.view addSubview: button];
        }

    - (UIButton *) createButton:(UIButton *)control xPos:(CGFloat)x yPos:(CGFloat)y width:(CGFloat)width height:(CGFloat)height caption:(NSString *)caption textPos:(NSTextAlignmentCenter)textPosition textClr:(UIColor *)textColor backClr:(UIColor *)backColor
        {
            control = [[UIButton alloc] initWithFrame: CGRectMake(x, y, width, height)];
            [control setTitle:caption forState:UIControlStateNormal];
            control.titleLabel.textAlignment = textPosition;
            control.backgroundColor = backColor;
            [control setTitleColor: textColor forState:UIControlStateNormal];
            return control;
        }
  1. 这个实现有什么问题/坏处吗?

  2. 不使用方法,是否可以仅使用普通的旧函数来实现相同的功能?必须指出参数名称有点啰嗦,xPos:30 yPos:100 width:100 height:100 等

如果能做这样的事情就好了:

button = createButton(30, 100, 100, 30, @"autoButton", NSTextAlignmentCenter, [UIColor blackColor], [UIColor yellowColor]);

这可行吗?

【问题讨论】:

  • 您已经编写的方法不一定有问题,但是,根据您使用按钮的方式/位置,子类化 UIButton 并添加自定义初始化程序可能是一个更聪明的主意。我不会使用这样的函数,因为您不是用 C 编写的。我倾向于使用带有自定义初始化程序的子类,以使代码更具可移植性和模块化。
  • @Dare:那不是说所有那些自定义的子类 UI 类都必须单独导入吗?
  • 是的,它们需要被导入,但 Objective-C 是一种面向对象的语言。一般来说,使用子类比用视图初始化器填充视图控制器更好。它会很好地工作,但如果你想在任何其他类甚至另一个项目中使用该方法,它就会变得更加困难。
  • @Dare:你是对的。谢谢。

标签: ios objective-c macos user-interface


【解决方案1】:
  1. 很好,只是传入button 参数没有意义。只需返回一个UIButton 对象。

    - (void) viewDidLoad
        {
            [super viewDidLoad];
            button = [self createButtonWithxPos:30 yPos:100 width:100 height:30  caption:@"autoButton" textPos:NSTextAlignmentCenter textClr:[UIColor blackColor] backClr:[UIColor yellowColor]];
            [self.view addSubview: button];
        }
    
    - (UIButton *) createButtonWithxPos:(CGFloat)x yPos:(CGFloat)y width:(CGFloat)width height:(CGFloat)height caption:(NSString *)caption textPos:(NSTextAlignmentCenter)textPosition textClr:(UIColor *)textColor backClr:(UIColor *)backColor
        {
            UIButton *control = [[UIButton alloc] initWithFrame: CGRectMake(x, y, width, height)];
            [control setTitle:caption forState:UIControlStateNormal];
            control.titleLabel.textAlignment = textPosition;
            control.backgroundColor = backColor;
            [control setTitleColor: textColor forState:UIControlStateNormal];
            return control;
        }
    
  2. 好的,使用函数或方法。由你决定。只要你不需要self 参与,一个函数就可以工作。

    UIButton *createButton(CGFloat x, CGFloat y, CGFloat width, CGFloat height, NSString *caption, NSTextAlignmentCenter textPosition, UIColor *textColor, UIColor *backColor) {
        UIButton *control = [[UIButton alloc] initWithFrame: CGRectMake(x, y, width, height)];
        [control setTitle:caption forState:UIControlStateNormal];
        control.titleLabel.textAlignment = textPosition;
        control.backgroundColor = backColor;
        [control setTitleColor: textColor forState:UIControlStateNormal];
        return control;
    }
    
    - (void) viewDidLoad
        {
            [super viewDidLoad];
            button = createButton(30, 100, 100, 30, @"autoButton", NSTextAlignmentCenter, [UIColor blackColor], [UIColor yellowColor]);
            [self.view addSubview: button];
        }
    

【讨论】:

  • 非常感谢!超出了我的预期 - 通过有效的解决方案来回答问题。真的很感激。
【解决方案2】:

您可以使用分类Objective-c 中的内置功能
1.Apple documentary for customising classes
2.Categories tutorial

【讨论】:

  • 如果您解释了这些概念实际上如何用于回答问题,这个答案会更有用。
  • 在IOS中添加查看对象的方法更正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多