Динамически создать UIButton в пользовательском представлении - Цель C - PullRequest
0 голосов
/ 02 сентября 2011

Я создаю пользовательское представление, которое будет действовать как панель нижнего колонтитула, поэтому я могу передать несколько представлений вместо использования IB для добавления времени и т. Д., Чтобы сэкономить время и узнать больше о кодировании.

Мой класс сначала создает фон, затем я добавляю к этому UIButton, но по какой-то причине текст не отображается, а также щелчок не срабатывает.

Файл пользовательского класса h:

    @interface menuViewone : UIView {

       IBOutlet UIView *menuback;

    }

    -(void)nextPage;

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

Мой пользовательский класс mfile:

    -(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 не работает, и я не получаю вывод NSLog из метода - (void) nextPage {...

Вот тестодин, который я создал:

   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.

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];

 .....

И когда я попробовал это, метод clicked сработал.

Так что это должно быть как-то связано с моим пользовательским представлением классаи настройки моей кнопки, как будто ее не распознал ?? ??

Спасибо Si

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

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. Если это не сработает, убедитесь, что состояние кнопки соответствует состоянию, для которого вы установили текст. Вы можете либо установить состояние кнопки, либо установить текст для большего количества состояний (причем последнее предпочтительнее).

0 голосов
/ 02 сентября 2011

Прежде всего, вы создаете кнопку с методом класса, в этом случае вы не должны отпускать ее. Метод класса возвращает автоматически освобожденный объект. Во-вторых, утечка памяти в вашем следующем коде:

- (void)viewDidLoad
    {

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


        [super viewDidLoad];


    }

Вы должны отпустить * переменную меню, поскольку она является локальной, и она получает сохранение при добавлении ее в качестве подпредставления.

Итак, сначала исправьте утечки памяти, после этого мы поговорим.

Обновление: И чтобы добавить к господину не высокомерный ответ, я бы выбрал UIControlEventTouchDown вместо UIControlEventTouchUpInside. Событие UIControlEventTouchUpInside очень странное, иногда оно не отправляет уведомления вашим обработчикам.

...