在自定义视图中动态创建UIButton - 目标C.

时间:2011-09-02 13:02:59

标签: objective-c uiview uibutton dynamic

我正在创建一个自定义视图,它将像一个页脚栏一样,因此我可以传入多个视图,而不是使用IB添加等节省时间并学习更多编码。

我的班级首先创建背景,然后我为此添加一个UIButton,但由于某种原因,文本没有显示,而且点击也没有触发。

自定义类h文件:

    @interface menuViewone : UIView {

       IBOutlet UIView *menuback;

    }

    -(void)nextPage;

    -(void)menubackground;
    -(void)nextButton;

我的自定义类m文件:

    -(void)nextPage{
        NSLog(@"Next Page Clicked");
    }


    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
                }
        return self;
    }

    -(void)menubackground{

        NSLog(@"Menu Background Loaded");
                menuback = [[UIView alloc] initWithFrame:CGRectMake(0, 410, 320, 50)];
        [menuback setBackgroundColor:[UIColor yellowColor]];
        [self addSubview:menuback];
        [menuback release];

         [self nextButton];
    }

    -(void)nextButton{

        NSLog(@"Create Next Button");

        UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        nextBtn.frame = CGRectMake(0, 410, 60, 50);
        [nextBtn setBackgroundColor:[UIColor redColor]];
        nextBtn.titleLabel.text = @"next";
        nextBtn.titleLabel.textColor = [UIColor blackColor];
        [nextBtn setTitle:@"Next" forState:UIControlStateNormal];
        [nextBtn addTarget:self action:@selector(nextPage:) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:nextBtn]; 

    }

我在我的主m文件中使用:

调用它
    #import "menuViewone.h"

    .......

    - (void)viewDidLoad
    {

       menuViewone *menu = [[menuViewone alloc] init];
       [menu menubackground];
       [self.view addSubview:menu];
       [menu release];

        [super viewDidLoad];


    }

所以此刻我得到一个黄色页脚背景,左边有一个红色按钮,但没有动作或标签

1:怎么回事? 2:我这样做了吗?

更新 我已经解决了文本的问题没有显示当我释放按钮时会发生如下所述的自动释放。

所以现在我唯一的问题是click事件不起作用,而且我没有从 - (void)nextPage {..方法获得我的NSLog输出。

这是我创建的测试:

   UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

  [nextBtn setFrame:CGRectMake(0, 100, 80,40)];

  [nextBtn setTitle:@"Button Title" forState:UIControlStateNormal];

  [nextBtn.titleLabel setFont:[UIFont boldSystemFontOfSize:10]];

  [nextBtn addTarget:self action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside];

  [self addSubview:nextBtn];

但似乎好像        [nextBtn addTarget:self action:@selector(nextPage :) forControlEvents:UIControlEventTouchUpInside];

没有解雇?

另一个更新:

我在root / my view Controller上尝试了以下代码。

viewController.h          - (void)nextPage:(id)sender;

viewController.m

 -(void)nextPage: (id)sender
  {
     NSLog(@"Next Page Clicked");
  }
  - (void)viewDidLoad
  {

       CGRect buttonFrame = CGRectMake( 10, 280, 100, 30 );
      UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];
      [button setTitle: @"My Button" forState: UIControlStateNormal];
      [button setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
      [self.view addSubview: button];
     [button addTarget: self 
           action: @selector(nextPage:) 
 forControlEvents: UIControlEventTouchDown];

 .....

当我尝试这个时,点击的方法有效。

所以它必须与我的自定义类视图和我的按钮的设置有关,就像它不被识别一样?

谢谢Si

2 个答案:

答案 0 :(得分:1)

由于您对选择器使用了错误的签名,因此不会调用NextPage。在:

    [nextBtn addTarget:self action:@selector(nextPage:) forControlEvents:UIControlEventTouchUpInside];

nextPage之后的冒号意味着“一个名为nextPage的方法,只有一个参数。像nextPage:(int)pageNumber {}那样你有nextPage {}。如果你将那一行改为:

    [nextBtn addTarget:self action:@selector(nextPage) forControlEvents:UIControlEventTouchUpInside];

您的行动将被召唤。

标签我不太确定,但由于按钮样式和状态的组合,它可能不会显示。您绝对应该将UIButtonTypeCustom替换为UIButtonTypeRoundedRect。如果这不起作用,请确保按钮的状态与您为其设置文本的状态相匹配。您可以设置按钮的状态,也可以设置更多状态的文本(后者更可取)。

答案 1 :(得分:-2)

首先,您正在创建一个带有类方法的按钮,在这种情况下,您不应该发布它。 class方法返回一个自动释放的对象。 其次是下一个代码中的内存泄漏:

- (void)viewDidLoad
    {

        menuViewone *menu = [[menuViewone alloc] init];
       [menu menubackground];
       [self.view addSubview:menu];


        [super viewDidLoad];


    }

释放*菜单变量,因为它是本地变量,当你将其添加为子视图时它会获得保留。

首先纠正你的内存泄漏,之后我们会谈谈。

更新:并且要添加给先生不是傲慢的答案,我会选择UIControlEventTouchDown而不是UIControlEventTouchUpInside。 UIControlEventTouchUpInside事件非常奇怪,有时它不会向处理程序发送通知。