Удалить подвид из суперпредставления

Я действительно застрял в этом вопросе в течение довольно долгого времени

Я пытаюсь добавить UIControl (который в конце концов является UIView) к UITableViewCell, у которого есть подклассы в моем собственном классе (я создал пользовательскую ячейку)

при свайпе я создаю свой класс UIControl и добавляю его себе (ячейке), пока все хорошо. Вот код

[self addSubview:_statusView];

Однако я добавляю целевое действие к своему UIControl в пользовательской ячейке, чтобы ячейка могла обрабатывать, когда UIControl говорит, что он распознал touchDownEvent.

[self.statusView addTarget:self action:@selector(resetAll:) forControlEvents:UIControlEventTouchDown];

И вот что я хочу сделать в действии, я хочу удалить этот UIControl из self.subviews (подвиды ячейки), поэтому я установил метод действия следующим образом

- (void)resetAll:(id)sender
{
for (UIView *view in self.subviews) {
    if ([view isKindOfClass:[StatusView class]]) {
        [view removeFromSuperview];
    }
}
}

Может ли кто-нибудь указать, что не так в этом коде? потому что я не могу понять, почему представление, которое добавляется в ячейку, не удаляется. Мне кажется, что свойство subviews никогда не содержит моего UIControl, который я добавляю.


person Emad Abdulrahim    schedule 24.07.2014    source источник
comment
ваш resetAll: вызывается селектор   -  person Sunil Pandey    schedule 24.07.2014
comment
Почему бы просто не позвонить [sender removeFromSuperview]?   -  person Paulw11    schedule 24.07.2014
comment
resetALL: действительно вызывается. sender это событие? это не тот UIView, который я хочу удалить.   -  person Emad Abdulrahim    schedule 24.07.2014
comment
С какой стати я получил -1 репутацию за этот вопрос? этот сайт иногда тормозит.   -  person Emad Abdulrahim    schedule 24.07.2014


Ответы (2)


UITableViewCell внутренне выполняет некоторые манипуляции со своей иерархией представлений. Вы должны добавлять подвиды не в саму ячейку, а в ее contentView, как указано в документы:

Если вы хотите выйти за рамки предопределенных стилей, вы можете добавить подпредставления в свойство contentView ячейки.

Итак, вы должны заменить

[self addSubview:_statusView];

с участием

[self.contentView addSubview:_statusView];

А затем повторите подвиды contentView:

for (UIView *view in self.contentView.subviews) {
    if ([view isKindOfClass:[StatusView class]]) {
        [view removeFromSuperview];
    }
}
person Michał Ciuba    schedule 24.07.2014
comment
Самое простое решение, которое я нашел, и намного проще, чем создание подклассов. Спасибо! - person smileham; 04.05.2016

person    schedule
comment
Первое решение не будет работать как resetAll: метод вызывается для UITableViewCell и не имеет свойства view - person Michał Ciuba; 24.07.2014
comment
Что вы имеете в виду, когда говорите self.view.subviews? self уже является ячейкой, которая является UIView. - person Emad Abdulrahim; 24.07.2014
comment
это сработало для меня. Спасибо! за (UIView * представление в self.view.subviews) { if ([представление isKindOfClass: [класс StatusView]]) { [представление removeFromSuperview]; } } - person Anilkumar iOS - ReactNative; 07.04.2016