Я думаю, что проблема в том, что он показывает код вместо результата, так это то, что он не будет на локальном хосте. перепроверьте, какой адрес ур собирается. И отправляемся в локальный каталог файлов или на локальный хост.
из скриншота u отправил его на ур компьютер не на localhost.
"file: ///" это должен быть "localhost /"
Хорошо, наконец нашел его после некоторого поиска через документы распознавания жестов.
Решением было реализовать UIGestureRecognizerDelegate
и добавить следующее:
////////////////////////////////////////////////////////////
// UIGestureRecognizerDelegate methods
#pragma mark UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([touch.view isDescendantOfView:autocompleteTableView]) {
// Don't let selections of auto-complete entries fire the
// gesture recognizer
return NO;
}
return YES;
}
Это. Надеюсь, это тоже поможет другим.
Мое дело было другим, включая uisearchbar и uitableview на self.view. Я хотел убрать клавиатуру uisearchbar, прикоснувшись к представлению.
var tapGestureRecognizer:UITapGestureRecognizer?
override func viewWillAppear(animated: Bool) {
tapGestureRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleTap:"))
}
В методах делегатов UISearchBar:
func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {
view.addGestureRecognizer(tapGestureRecognizer!)
return true
}
func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool {
view.removeGestureRecognizer(tapGestureRecognizer!)
return true
}
Когда пользователь затрагивает self.view:
func handleTap(recognizer: UITapGestureRecognizer) {
sampleSearchBar.endEditing(true)
sampleSearchBar.resignFirstResponder()
}
Простое решение использует экземпляры UIControl в UITableViewCell для получения касаний. Вы можете добавлять любые представления с помощью userInteractionEnables == NO для UIControl для получения кранов.
Хотя уже поздно, и многие люди считают, что приведенные выше предложения работают нормально, я не мог заставить методы Джейсона или Тмиллигана работать.
У меня есть Static tableView с несколькими ячеями, содержащими текстовые поля, которые получают входные данные Number, используя только цифровую клавиатуру. Это было идеально для меня:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if(![touch.view isKindOfClass:[UITableViewCell class]]){
[self.firstTF resignFirstResponder];
[self.secondTF resignFirstResponder];
[self.thirdTF resignFirstResponder];
[self.fourthTF resignFirstResponder];
NSLog(@"Touches Work ");
return NO;
}
return YES;
}
Убедитесь, что вы внедрили это <UIGestureRecognizerDelegate>
в ваш .h-файл.
Эта строка ![touch.view isKindOfClass:[UITableViewCell class]]
проверяет, был ли задействован tableViewCell и отклоняет любую активную клавиатуру.
Вот мое решение, которое напрямую связывает распознаватель's shouldReceiveTouch с тем, отображается ли клавиатура.
В вашем делегате распознавателя распознавания жестов:
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([PFXKeyboardStateListener sharedInstance].visible) {
return YES;
}
return NO;
}
И PFXKeyboardStateListener.h
:
@interface PFXKeyboardStateListener : NSObject
{
BOOL _isVisible;
}
+ (PFXKeyboardStateListener *)sharedInstance;
@property (nonatomic, readonly, getter=isVisible) BOOL visible;
@end
И PFXKeyboardStateListener.m
:
static PFXKeyboardStateListener *sharedInstance;
@implementation PFXKeyboardStateListener
+ (PFXKeyboardStateListener *)sharedInstance
{
return sharedInstance;
}
+ (void)load
{
@autoreleasepool {
sharedInstance = [[self alloc] init];
}
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (BOOL)isVisible
{
return _isVisible;
}
- (void)didShow
{
_isVisible = YES;
}
- (void)didHide
{
_isVisible = NO;
}
- (id)init
{
if ((self = [super init])) {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
[center addObserver:self selector:@selector(didHide) name:UIKeyboardWillHideNotification object:nil];
}
return self;
}
@end
Возможно, вам захочется обновить одноэлементный образец прослушивателя клавиатуры, я еще не получил его. Надеюсь, это работает для всех остальных, а также для меня. ^^
У меня может быть лучшее решение для добавления жесты касания к представлению таблицы, но одновременного выбора ячейки:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if gestureRecognizer is UITapGestureRecognizer {
let location = touch.locationInView(tableView)
return (tableView.indexPathForRowAtPoint(location) == nil)
}
return true
}
Я просто ищу ячейку в точке экрана, где пользователь нажимает. Если индексный путь не найден, я позволяю жестом получать прикосновение, иначе я отменил его. Для меня это отлично работает.
Использовать этот метод для делегата UIGestureRecognizer:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
UIView *superview = touch.view;
do {
superview = superview.superview;
if ([superview isKindOfClass:[UITableViewCell class]])
return NO;
} while (superview && ![superview isKindOfClass:[UITableView class]]);
return superview != nil;
}
Это мое решение, основанное на вышеприведенных ответах ... Это сработало для меня ...
//Create tap gesture for menu transparent view
UITapGestureRecognizer *rightTableTransparentViewTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rightTableTransparentViewTapMethod:)];
[rightTableTransparentViewTap setCancelsTouchesInView:NO];
[_rightTableTransparentView addGestureRecognizer:rightTableTransparentViewTap];
- (void)rightTableTransparentViewTapMethod:(UITapGestureRecognizer *)recognizer {
//Write your code here
}
Самый простой способ решить эту проблему:
UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(tap:)];
[tapRec setCancelsTouchesInView:NO];
Это позволяет UIGestureRecognizer
распознавать кран и также передавать касание следующему ответчику. Непредвиденным следствием этого метода является наличие на экране UITableViewCell
экрана, который выталкивает другой контроллер вида. Если пользователь удаляет строку, чтобы закрыть клавиатуру, будут распознаны клавиатура и нажатие. Я сомневаюсь, что это то, что вы намереваетесь, но этот метод подходит для многих ситуаций.
Кроме того, расширяя ответ Роберта, если у вас есть указатель на рассматриваемый столбец, то вы можете прямо сравнить его класс вместо необходимости конвертировать в строку и надеяться, что Apple не изменит номенклатуру:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch
{
if([touch.view class] == tableview.class){
return //YES/NO
}
return //YES/NO
}
Помните, что вы также должны объявить UIGestureRecognizer
делегатом с этим кодом.
isDescendantOfView
вместо того, чтобы просто проверять, является ли class
равным, поскольку вы можете прослушивать subview. Зависит от того, что вам нужно.
– shim
16 June 2016 в 21:31
ВОПРОС: В моем случае проблема заключалась в том, что я изначально поместил кнопку в каждую ячейку коллекции и установил ограничения для заполнения ячейки, так что, когда ячейка была нажата, она нажала кнопку, однако функция кнопок была пуста поэтому ничего не происходило.
FIX: Я исправил это, удалив кнопку из ячейки коллекции.
Установите cancelsTouchesInView
вашего распознавателя на значение false. В противном случае он «потребляет» прикосновение для себя и не передает его в виде таблицы. Вот почему событие выбора никогда не происходит.
, например, в swift
let tapOnScreen: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "CheckTheTime")
tapOnScreen.cancelsTouchesInView = false
view.addGestureRecognizer(tapOnScreen)
И для Swift (на основе ответа от @Jason):
class MyAwesomeClass: UIViewController, UIGestureRecognizerDelegate
private var tap: UITapGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
self.tap = UITapGestureRecognizer(target: self, action: "viewTapped:")
self.tap.delegate = self
self.view.addGestureRecognizer(self.tap)
}
// UIGestureRecognizerDelegate method
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if touch.view?.isDescendantOfView(self.tableView) == true {
return false
}
return true
}
Аналогичное решение заключается в реализации gestureRecognizer:shouldReceiveTouch:
с использованием класса представления, чтобы определить, какое действие нужно предпринять. Преимущество такого подхода состоит в том, что в области, непосредственно связанной с таблицей, нет маскирующих кранов (эти области все еще сходят с экземпляров UITableView, но не представляют собой ячейки).
У этого также есть бонус, что он работает с несколькими таблицами на одном представлении (без добавления дополнительного кода).
Предостережение: есть предположение, что Apple не будет измените имя класса.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return ![NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"];
}
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
– Nianliang
26 December 2016 в 13:01
Я думаю, что нет необходимости писать блоки кодов, просто установите cancelsTouchesInView
на false
для вашего объекта жестов, по умолчанию это true
, и вам просто нужно установить его false
. Если вы используете UITapGesture
объект в своем коде, а также с помощью UIScrollView
(tableview, collectionview), установите это свойство false
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
В swift вы можете использовать это внутри
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if CheckTheTime() == true {
// do something
}else{
}
}
func CheckTheTime() -> Bool{
return true
}
return ![touch.view isKindOfClass:[UITableViewCell class]];
– Josh Paradroid 21 February 2013 в 15:57![touch.view isEqual: self.tableView] &&
перед[touch.view isDescendantOfView: self.tableView]
, чтобы исключить самtableView
(посколькуisDescendantOfView:
также возвращаетYES
, если аргумент- view - это представление получателя). Надежда, которая помогает другим людям, которые хотят получить тот же результат. – anneblue 4 September 2015 в 14:15