2012-03-14 3 views
0

У меня есть экран поповер, с внутри него:UITableViewCell перестает отвечать на запросы

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

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

Я пробовал все: все перемещалось до viewWillAppear, позволяя авторезистировать выполнять свою работу (похоже, не работает), но у меня все еще есть эта проблема каждый раз. Я обнаружил, что если я прокомментирую строки, связанные с изменением 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

ответ

0

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

0

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

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

Опубликовать код, тогда мы сможем лучше посмотреть.

+0

Просто добавил код и изображение –

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