2012-02-24 5 views
3

Я хочу добавить представление и кнопку программно, как показано ниже.Программно добавление вида с помощью кнопки

Проблема в том, что кнопка не реагирует на нажатие. Я имею в виду, что он не подсвечивается или не вызывает селектор.

Причина в том, что я хочу реализовать строку списка для записи (звуковой файл). Строку списка следует выбирать для развертки и иметь кнопку воспроизведения. Поэтому я получил RecordingView подклассу UIView, который сам добавляет кнопку, используя цель от конструктора. См. Код ниже.

listrow

Если у кого есть лучший подход, чтобы сделать это, что также может быть решением.

@implementation MyViewController

- (IBAction) myAction { 
    RecordingView *recordingView = [[RecordingView alloc] initWithFrame:CGRectMake(30, 400, 130, 50)withTarget:self]; 
    [recordingView setUserInteractionEnabled:YES]; 
    [[self view] addSubview:recordingView]; 
} 

@implementation RecordingView

- (id)initWithFrame:(CGRect)frame withTarget:(id) target 
{ 
    self = [super initWithFrame:frame]; 

    UIButton *playButton = [[UIButton alloc] initWithFrame:CGRectMake(185, 5, 80, 40)]; 
    [playButton setTitle:@"Play" forState:UIControlStateNormal]; 
    [playButton setTitleColor:[UIColor darkTextColor]forState:UIControlStateNormal]; 
    // creating images here ... 
    [playButton setBackgroundImage:imGray forState: UIControlStateNormal]; 
    [playButton setBackgroundImage:imRed forState: UIControlStateHighlighted]; 
    [playButton setEnabled:YES]; 
    [playButton setUserInteractionEnabled:YES]; 
    [playButton addTarget: target 
        action: @selector(buttonClicked:) 
     forControlEvents: UIControlEventTouchDown]; 

    [self addSubview:playButton]; 

    return self; 
} 

Когда я добавляю кнопку так же, прямо в контроллера представления .m-файла, кнопка не реагирует на нажатия. Так что есть что-то о RecordingView. Что мне нужно делать здесь?

Также есть ли какие-либо лучшие способы обеспечения цели и выбора для события касания?

+0

Это ваш фактический код? Где вы объявляете или заполняете две переменные UIImage (imGrey и imRed)? У вас есть метод init, поэтому они не могут быть иварами? Что касается вашего вопроса, вы говорите, что хотите список записей - вы после просмотра таблицы? Может ли ваш вид записи быть подклассом ячейки таблицы? – jrturton

+0

Правда, я пропустил код для создания изображений. Это мой фактический код, но я удаляю материал при публикации, для простоты. Я уточню это. Да, представление записи может быть ячейкой таблицы. Я новичок в создании iOS UI из кода. Это одно из моих первых, поэтому любые направления вперед приветствуются.:) – JOG

+0

@jrturton: Да, я планирую использовать этот код в UITableViewDelegate, в методе '- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath'. ... когда я получаю его на работу, то есть. ^^ – JOG

ответ

5

Вам может потребоваться установить userInteractionEnabled в YES на RecordingView.

Другой проблема заключается в том, что вы создаете RecordingView с шириной кадра 130, но вы установка по оси Й происхождения playButton до 185. Это означает, что playButton полностью вне границ его надтаблицы. Значение по умолчанию для clipsToBounds равно NO, поэтому кнопка нарисована в любом случае. Но сенсорные события никогда не дойдут до кнопки, потому что они отклоняются, когда система попадает в тесты RecordingView.

Это из документации hitTest:withEvent: в UIView Class Reference:

Точки, лежащие вне границ приемника никогда не сообщается, как хиты, даже если они на самом деле находятся в пределах одного из подвидов приемника. Это может произойти, если для свойства текущего вида clipsToBounds установлено значение NO, а затронутое подвьюстекло выходит за пределы представления.

Вы должны либо сделать кадр RecordingView «s шире, или переместить playButton быть в пределах своей надтаблицы.

+0

Нет, не работает. Я обновляю код вопроса. – JOG

+0

Я исправил свой ответ. –

+0

это была ширина, thanx так много – JOG