2013-10-12 3 views
2

У меня есть UITableView, заполненный множеством пользовательских UITableViewCells. Каждый из них имеет цветной прямоугольник как subview (в настоящее время это стилизованный UIButton, но я могу его реализовать в любом случае).Вызов didSelectRowAtIndexPath только для части UITableViewCell

Я хочу, чтобы UITableViewCell вызывал tableview:didSelectRowAtIndexPath: только при выборе этой части.

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

Я не уверен, следует ли ограничить область ячейки, которая запускает метод, или отключить запуск из ячейки, и вместо этого разрешить подзапрос инициировать метод. В любом случае, я не знаю деталей реализации.

+0

Почему вы не используете метод действия кнопки? – Wain

ответ

2

В didSelect введите свою ячейку (переданную вам) и проверьте, выбрана ли кнопка в этой ячейке. Если это то, что нужно, иначе проигнорируйте его.

+0

О, это умный способ, спасибо! Но как бы проверить, нажата ли кнопка? Кроме того, есть ли способ сделать его подсветкой только кнопки, а не всей ячейки? Например, просмотрите приложение «Настройки» (или любое приложение с шаблоном мастер-детали). Когда вы нажимаете на ячейку, она выделяется, а затем переходит к другому контроллеру представления. и когда вы ударяете назад, он отступает назад, а также удерживает выделенную ячейку до тех пор, пока анимация segue не будет завершена, а затем она не осветит ее. Можно ли получить это поведение только с прямоугольником, а не со всей строкой? Спасибо за быстрый ответ! – golddove

+0

Когда кнопка нажата, сделайте [кнопка setSelected: YES]; чтобы увидеть, выбрана ли кнопка do.isSelected; (сделайте наоборот, чтобы снять выделение). Но убедитесь, что вы связали выбранный с вашим источником данных, в противном случае ячейки с переадресацией могут перемещать кнопки вокруг. Чтобы «выделить», вы можете изменить цвет или изображение для кнопки (для состояния по умолчанию или выбранного состояния). Это также можно сделать в интерфейсе builder –

+0

Что произойдет, если пользователь нажмет кнопку, переместит палец вправо (выключен от кнопки) и отпустит? Есть ли способ принять меры, только если кнопка нажата и отпустит? – golddove

1

Я не знаю, почему вы хотите вызвать didSelectRowAtIndexPath: но если вы хотите получать события касания от кнопки, вы можете подключить кнопку нажатой кнопки (прикоснуться внутрь) к контроллеру табличного представления, если вы подклассифицировали его или подключите его к делегату контроллера табличного представления, если вы его делегировали. Если вам действительно нужно выбрать строку, вы можете позвонить по номеру selectRowAtIndexPath:animated:scrollPosition: и выбрать строку программно, когда кнопка нажата.

+0

Если я сделаю эту вторую реализацию, это не помешает пользователю выбрать строку вне кнопки. Проблема с первой заключается в том, что я могу потерять любое дополнительное поведение, которое получается из метода делегирования didSelectRowFromIndexPath. Я не очень свободно говорю с ios, поэтому я не уверен. Что все, что делает метод didSelectRowAtIndexPath, который я бы не получил, если бы я просто вызвал его собственный целевой метод? Например, посмотрите на мой комментарий для @WilliamFalcon, я все еще получаю это поведение с помощью своего собственного метода? – golddove

+0

Вся идея методов делегатов заключается в том, что они позволяют вам добавлять пользовательское поведение. Если вы не делегируете его, он будет вести себя нормально. Вы можете вызвать selectRowAtIndexPath: анимированный: scrollPosition: вручную, если вас беспокоит, что есть и другие побочные эффекты. –

-1

Создайте собственный подкласс UITableViewCell и в этом - добавьте свою собственную кнопку. В любой области, которую вы хотите.

+0

Как я уже сказал, это обычная ячейка. И, как я уже сказал, в нем есть UIButton. И да, это подкласс. Как я буду делать то, что я задал в своем вопросе? – golddove

0

Вы считаете, что не вызываете didSelectRowAtIndexPath и вместо этого создаете действие для UIButton для запуска при его касании? Я не уверен точно, что вы хотите сделать, когда коснется UIButton, но позволяет сказать, что вы просто хотели нажать новый контроллер просмотра в этом методе.

Если вы используете nib или storyboard и ваш UITableView экземпляр принадлежат к UITableViewController вы можете подключить ваш UIButton к действию, который выглядит, как это,

-(IBAction)buttonTapped:(id)sender { 

    NewViewController *newViewController = [[NewViewController alloc] init]; 
    [newViewController setSomeProperty:property]; 
    [[self navigationController] pushViewController:newViewController animated:YES]; 
} 

Если вы не используете nib или storyboard затем вы можете просто подключить действие к UIButton программным способом в вашем методе init или в другом месте.

+0

Это не корневой вид UITableViewController, но он имеет делегат и источник данных. Что касается этого, посмотрите на мой комментарий для @SaintMacintosh. – golddove

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