UITableViewCell перестает отвечать на запросы - PullRequest
0 голосов
/ 14 марта 2012

У меня есть всплывающий экран, внутри которого:

  • метка, которая может появляться или не появляться (название)
  • панель поиска, которая может появляться или не появляться
  • метка, которая может появляться или не появляться, и имеет переменную высоту (метка справки)
  • вид прокрутки, которая может появляться или не появляться, и имеет переменную высоту (некоторые сведения оследующая таблица)
  • представление таблицы

Чтобы представить что-то хорошее, в viewDidLoad я перемещаю различные кадры, чтобы правильно разместить объекты и не загромождать неиспользуемые пробелымой поповерКроме того, я затем изменяю размер таблицы (чтобы занять как можно больше места) и всплывающее окно с помощью contentSizeInPopover (чтобы избежать почти пустого огромного всплывающего окна).Кажется, что все это изменение размера работает хорошо, но у меня есть одна большая проблема: после всего этого изменения размера некоторые ячейки моего UITableView перестают отвечать на запросы.Одна или две ячейки, обычно вторая, отвечают только в том случае, если я коснусь их внешних углов, но остальная часть ячейки полностью игнорирует любые касания.

Я перепробовал все: переместил все в viewWillAppear,позволить autoresize делать свою работу (кажется, тоже не работает), но у меня все еще есть эта проблема каждый раз.Я обнаружил, что если я прокомментирую строки, связанные с изменением frame таблицы, или те, что в contentSizeInPopover, проблема прекращается, но тогда мое представление испортилось, так что это не исправить.

Если бы кто-нибудь мог дать мне что-нибудь, чтобы выбраться из этого беспорядка, это было бы замечательно.

- (CGFloat)getHeightWithoutTable {
    return LIST_TITLE_HEIGHT + (self.searchBar.hidden ? 0 : LIST_SEARCH_BAR_HEIGHT) + (self.helpLabel.hidden ? 0 : self.helpLabel.frame.size.height + LIST_STD_SPACE) + (self.errorScrollView.hidden ? 0 : self.errorScrollView.frame.size.height + LIST_STD_SPACE);
}

-(void)viewDidLoad {
    [super viewDidLoad];
    self.tableViewOutlet.backgroundView = nil;
    self.originData = [NSMutableArray array];
    self.searchedData = [NSMutableArray array];
    if (self.helper != nil) {
        CGFloat heightOffset = 0;
        // Content
        self.originData = [self.helper getData];
        self.tableData = [NSMutableArray arrayWithArray:self.originData];
        // Title
        NSString *title = [self.helper getPopoverTitle];
        if (title == nil) {
            self.popoverTitle.hidden = YES;
            heightOffset -= LIST_TITLE_HEIGHT;
        } else {
            self.popoverTitle.text = [self.helper getPopoverTitle];
        }
        // Search
        if ([self.originData count]  [self getStdHeight] / 3){
                self.helpLabel.lineBreakMode = UILineBreakModeTailTruncation;
                [self.helpLabel sizeThatFits:CGSizeMake(self.helpLabel.frame.size.width, [self getStdHeight] / 3)];
            }

            heightOffset += (self.helpLabel.frame.size.height - LIST_HELP_STD_HEIGHT);
        }
        // Errors
        if ([self.helper respondsToSelector:@selector(getErrors)]) {
            self.errors = [self.helper getErrors];
        }
        if (self.errors == nil || [self.errors count] == 0) {
            self.errorScrollView.hidden = YES;
            self.errorBg.hidden = YES;
            heightOffset -= LIST_ERROR_STD_HEIGHT + LIST_STD_SPACE;
        } else {
            [self createErrorView];
            heightOffset += (self.errorScrollView.frame.size.height - LIST_ERROR_STD_HEIGHT);
        }
        // Table
        CGFloat previewHeight = LIST_CELL_HEIGHT * [self.tableData count] + LIST_STD_SPACE;
        CGFloat remainingHeight = LIST_MAX_HEIGHT - [self getHeightWithoutTable] - LIST_STD_SPACE;
        CGFloat tableHeight = MIN(previewHeight, remainingHeight);
        CGRect tableFrame = self.tableViewOutlet.frame;
        self.tableViewOutlet.frame = CGRectMake(tableFrame.origin.x, tableFrame.origin.y + heightOffset, LIST_WIDTH, tableHeight);
        // Selected items
        if ([helper getSelectedObject] != nil){
            int index = [self.tableData indexOfObject:[helper getSelectedObject]];
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
            [self.tableViewOutlet scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        }
    }
}

- (CGSize)contentSizeForViewInPopover {
    if (self.navigationController) {
        return CGSizeMake(LIST_WIDTH, LIST_MAX_HEIGHT);
    } else {
        CGFloat totalHeight = [self getHeightWithoutTable] + self.tableViewOutlet.frame.size.height + LIST_STD_SPACE;
        return CGSizeMake(LIST_WIDTH, totalHeight);
    }
}

( gist , если вам нужна некоторая окраска, чтобы помочь вам)

Изображение пера:

nib

Ответы [ 2 ]

0 голосов
/ 21 апреля 2012

Я нашел ответ сам: проблема в том, что я использовал самозаполненный UIScrollView рядом с моим UITableView. Как только я заменил UIScrollView на правильный UITableView, проблема исчезла.

0 голосов
/ 14 марта 2012

Просто выстрел в темноте, так как вы не предоставили никакого кода.Если вы добавляете что-то в UITableCellView, просто помните, что для многих компонентов UserInteractionEnabled имеет значение NO, что отключает возможность взаимодействия с ним.Убедитесь, что все элементы, которые вы добавляете в ячейку, которые потенциально занимают место, где вы нажимаете (предположительно, центр ячейки?), Имеют для UserInteractionEnabled значение YES.

Причина, по которойрёбра всё ещё могут работать, так как UITableCellView состоит из 3 основных частей, поэтому вы, вероятно, меняете только центральную часть.

Опубликуйте некоторый код, чтобы мы могли выглядеть лучше.

...