2015-10-09 5 views
1

Я использую .xib для моей ячейки в виде таблицы. Внутри .xib есть другой вид (cellBackgroundView) и кнопка. Когда я запускаю приложение и нажимаю кнопку, он не отвечает вообще. Вместо этого он вызывает метод didSelectedRowAtIndexPath tableView, который добавляет другой контроллер вида.Кнопка не отвечает в таблице View Cell

Использование иерархической структуры отладки Xcode, я обнаружил, что у меня есть вид, накладывающий все кнопки (см. Рис. Вложение: этот оверлейный вид подсвечивается). Этот вид (называемый backgroundView), который накладывает мою кнопку, представляет собой представление в представлении. У меня возникает ощущение, когда вы размещаете представление в представлении и помещаете кнопку в начальное представление, кнопка не вызывается, потому что она ниже иерархии представлений.

Как исправить эту проблему? Есть ли способ переместить фоновый вид в обратную сторону иерархии представления, чтобы кнопки реагировали?

Debug Просмотр иерархии:
enter image description here

Структура .xib
enter image description here

ответ

1

Существует несколько методов UIView, которые позволяют изменять иерархию представлений.

bringSubviewToFront: 
sendSubviewToBack: 
insertSubview:atIndex: 
insertSubview:aboveSubview: 
insertSubview:belowSubview: 
exchangeSubviewAtIndex:withSubviewAtIndex: 

Поскольку ваши взгляды уже вставлены в надтаблицы, вы могли бы легко назвать exchangeSubviewAtIndex:withSubviewAtIndex: или sendSubviewToBack один раз для каждого вида в любом порядке, вам нравится.

+0

Эти методы очень полезны при программном создании/изменении иерархии представлений. Однако, хотя они могли бы помочь преодолеть проблему OP, я бы предложил исправить иерархию представлений (и/или кадров) в xib, а не писать дополнительный код для ее устранения. – lekksi

1

Две вещи, которые вы могли бы проверить

1) Есть ли у вас метод делегата для роста клеток и высота вернулась правильно? Если у вас нет Clip Subviews для UITableViewCell, содержимое ячейки может быть видимо вне его кадра, но части, которые находятся за пределами фрейма ячейки, не регистрируют взаимодействия пользователя.

2) Является ли какой-либо другой элемент представления выше в иерархии (ниже в списке XCode, который вы опубликовали) перекрывает кнопку? Симуляторы iOS Debug -> Color Blended Layers могут помочь определить это.

Редактировать: Если я правильно интерпретирую скриншоты, возможно, у вас есть проблема, упомянутая в варианте 1) выше. Если другие элементы, показанные на скриншоте, перечислены в качестве подзонов Cell Background View, они в основном находятся вне рамки родительского представления и, таким образом, не получают события касания. Если рамка фонового изображения верна, вы можете захотеть перенести другие элементы как дети на Feed Cell напрямую.

Кроме того, в списке элементов указано, что вы используете простой UIView в качестве родительского элемента. Я не знаю внутренней работы вашего приложения, но если вы используете это представление только в UITableViewCell, вам может потребоваться сделать родительский вид Table View Cell в xib. Это уменьшит раздувание и позволит вам настроить некоторые свойства для ячейки в xib.

+0

У меня на самом деле есть элемент вида выше в hiearchy. Как отодвинуть этот взгляд назад? Это представление называется backgroundView (см. Обновленный вопрос). –

+0

@ JoshO'Connor вы можете перетаскивать элементы в листинге на втором скриншоте. Обратите внимание, что элементы, находящиеся ниже в списке, имеют те, у которых более высокий индекс просмотра («Просмотр профиля профиля» имеет более низкий индекс, чем «Пользовательская метка») и, таким образом, будет поверх любого предыдущего элемента. Дополнительную информацию см. В моем обновленном ответе. – lekksi

0

Может быть, вы забыли присвоить кнопку коду

+0

Нет рабочего кода. Ive создал простой взгляд, и он отвечает. Он не отвечает, потому что он в представлении, в представлении (должен был сделать это для автоотключения) –

0

Я полагаю, Feed Cell подкласс UITableViewCell и cellBackgroundView является собственностью contentView этой ячейки.
Если это так, свойство ячеек backgroundView должно быть за вашим cellBackgroundView (docs сказать: UITableViewCell добавляет фоновый вид в качестве подзапроса за всеми другими видами и использует его текущее местоположение кадра.).
Вы можете установить свойство ячеек backgroundView = nil и посмотреть, все еще ли он в иерархии представлений. Если это так, вы добавляете пользовательский backgroundView поверх других ячеек.
Чтобы проверить это, вы можете зачитать иерархию подкатегории своей ячейки в своем методе tableView:cellForRowAtIndexPath: с чем-то вроде NSArray *svs = cell.subviews; (при условии, что cell - это tableViewCell) и установите контрольную точку за этим утверждением.
svs обычно содержит сначала UITableViewCellContentView, а над ним _UITableViewCellSeparatorView. Ячейки backGroundView не будут показаны. Вы можете проверить свою иерархию взглядов.
Если у вас есть обычай backgroundView сверху, вы можете - как обходное решение, а не решение - перенести contentView на передний план, отправив в ячейку bringSubviewToFront: с аргументом contentView. Затем кнопка должна ответить.

0

В вашей структуре Xib Разместите свою кнопку под видом, который сначала открывается в супервизор, затем на кнопку, затем ваша кнопка будет работать.

или вы можете закодировать

-(void)viewDidLayoutSubviews{ 

[self.view insertSubview:yourButton aboveSubview:cellBackgroundView]; 

} 

Надеется, что это поможет.

0

Вы добавляете код UIButton по коду?
Если да, то вам следует убедиться, что вы addSubview: в cell.contentView, а не в cell.

Также вы можете попробовать применить класс CellBackground к виду внутри contentView, а не непосредственно к contentView.

0

вы можете использовать этот метод.

[cell.contentView bringSubviewToFront:yourButton]; 

после этого, если вы хотите, чтобы поддержать в фоновом режиме, то доу может использовать sendSubviewToBack: метод.

После добавления этих методов ваша кнопка не отвечает, установите userIntractionEable надзора над кнопкой.

Смежные вопросы