Как передать связь от UITextView к UITableViewCell - PullRequest
14 голосов
/ 19 марта 2010

У меня есть UITextView в пользовательском UITableViewCell. Текстовое представление работает должным образом (прокрутка, показывает текст и т. Д.), Но мне нужно, чтобы пользователи могли коснуться ячейки таблицы и перейти на другой экран. Прямо сейчас, если вы коснетесь краев ячейки таблицы (то есть вне UItextView), будет вызван следующий вид. Но ясно, что внутри uitextview касания фиксируются и не передаются в ячейку таблицы.

Я нашел пост, в котором говорилось о создании подкласса UITextView для пересылки штрихов. Я попробовал это без удачи. Реализация ниже. Я задаюсь вопросом, может быть, а) супер моего текстового представления не является uitableviewcell, и поэтому мне нужно передать касание другим способом или б) если супер является uitableviewcell, если мне нужно передать что-то еще? Любая помощь будет высоко ценится.

#import "ScrollableTextView.h"

@implementation ScrollableTextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (parentScrollView) {
        [parentScrollView touchesBegan:touches withEvent:event];
    }
    [super touchesBegan:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    if (parentScrollView) {
        [parentScrollView touchesCancelled:touches withEvent:event];
    }
    [super touchesCancelled:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (parentScrollView) {
        [parentScrollView touchesEnded:touches withEvent:event];
    }
    [super touchesEnded:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (parentScrollView) {
        [parentScrollView touchesMoved:touches withEvent:event];
    }
    [super touchesMoved:touches withEvent:event];
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

@end

Ответы [ 3 ]

33 голосов
/ 22 марта 2010

Попробуйте [theTextView setUserInteractionEnabled:NO]; Если пользователь должен иметь возможность редактировать содержимое TextView, у вас могут возникнуть проблемы с дизайном.

Swift 3: theTextView.isUserInteractionEnabled = false

Раскадровка: установите флажок «Взаимодействие с пользователем включено».

2 голосов
/ 28 февраля 2015

Я знаю, что этот вопрос задавался 5 лет назад, но такое поведение все еще очень необходимо для того, чтобы какое-то приложение имело активируемую ячейку с UIDataDetectors.

Итак, вот подкласс UITextView, который я создал для соответствия этому конкретному поведению в UITableView

-(id) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.delegate = self;
    }
    return self;
}

- (BOOL)canBecomeFirstResponder {
    return NO;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *obj = self;

    do {
        obj = obj.superview;
    } while (![obj isKindOfClass:[UITableViewCell class]]);
    UITableViewCell *cell = (UITableViewCell*)obj;

    do {
        obj = obj.superview;
    } while (![obj isKindOfClass:[UITableView class]]);
    UITableView *tableView = (UITableView*)obj;

    NSIndexPath *indePath = [tableView indexPathForCell:cell];
    [[tableView delegate] tableView:tableView didSelectRowAtIndexPath:indePath];
}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    return YES;
}

Вы можете изменить это в соответствии со своими потребностями ...

Надеюсь, это кому-нибудь поможет.

1 голос
/ 10 марта 2015

Проблема с вашим решением состоит в том, что если вы поместите UITextView внутрь UITableViewCell, его суперпредставление не будет реальной ячейкой. Существует даже небольшая разница между iOS 7 и iOS 8 в структуре представления ячейки. Что вам нужно сделать, это развернуть (или развернуть) иерархию, чтобы получить UITableViewCell экземпляр.

Я использую и изменяю цикл while @ TheSquad, чтобы получить UITableViewCell и присвоить его свойству. Затем переопределите эти методы касания, при необходимости используйте метод касания ячейки и просто используйте реализации метода касания super, чтобы получить поведение по умолчанию.

// set the cell as property
@property (nonatomic, assign) UITableViewCell *superCell;

- (UITableViewCell *)superCell {
    if (!_superCell) {
        UIView *object = self;

        do {
            object = object.superview;
        } while (![object isKindOfClass:[UITableViewCell class]] && (object != nil));

        if (object) {
            _superCell = (UITableViewCell *)object;
        }
    }

    return _superCell;
}

#pragma mark - Touch overrides

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.superCell) {
        [self.superCell touchesBegan:touches withEvent:event];
    } else {
        [super touchesBegan:touches withEvent:event];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.superCell) {
        [self.superCell touchesMoved:touches withEvent:event];
    } else {
        [super touchesMoved:touches withEvent:event];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.superCell) {
        [self.superCell touchesEnded:touches withEvent:event];
    } else {
        [super touchesEnded:touches withEvent:event];
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.superCell) {
        [self.superCell touchesEnded:touches withEvent:event];
    } else {
        [super touchesCancelled:touches withEvent:event];
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...