所以再一次着名的话题。我不得不说我已经在这里阅读了所有类似的主题并且也用Google搜索了它。但没有任何帮助
我的应用程序结构如下:
RootController
为TabController
,然后每个标签都有自己的NavigationController
,里面有ViewController
。在ViewController中我放置了一个UITableView
。全部采用IB设计。 DataSource
和Delegate
已正确连接。 TableView
使用自定义TableCell
,但我也尝试过标准TableCell
。还有UISegmentedControl
来更改DataSource
数组
我检查并仔细检查了(简言之,我在类似主题中找到的所有内容):
ViewController
确实声明并实施UITableViewDelegate
和UITableViewDataSource
(或者无法连接IB中的相应属性)DataSource
和Delegate
属性在IB中正确连接。此外,它在代码中被setDelegate:self
和setDataSource:self
重复。TableCell
已标记用户互动已启用TableCell
包含2个标签和一个未启用用户交互标记的图像[tableView reloadData]
[tableView becomeFirstResponder]
didSelectRowAtIndexPath
中没有像DEselect那样的拼写错误。此外,TableView
的委托方法是通过改变代码内部方法的工作应用程序进行复制的。我的意思是方法名称/声明中没有任何拼写错误。didSelectRowAtIndexPath
方法只包含一个代码行,而且是NSLog(@"didSelectRowAtIndexPath");
XCode
多次重启clean all targets
ARC
TableView
本身在填充数据和显示数据方面表现良好。但是,如果我点击它突出显示的单元格为蓝色,它看起来像冻结了选择。从突出显示一个单元格的那一刻起,任何其他单元格都无法突出显示,并且突出显示的单元格无法取消选中。 didSelectRowAtIndexPath未被调用。但是如果试图通过拖动表格多次敲击单元格,那么有时该方法会调用。就像在非常罕见的情况下被调用一样,如果表中的记录不超过3个。这是一个非常奇怪的问题,我无法抗争。我觉得TableView接收了水龙头但不知何故无法处理它
ViewController:
@interface SecondTabVC : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
IBOutlet UISegmentedControl * sgmTopMenu; //has 3 segments
NSArray * arrHrefLinks;
NSArray * arrImgLinks;
IBOutlet UIImageView * imgFiles;
int selectedSegmentIndex;
IBOutlet UITableView* tblLinks;
}
@property (retain,nonatomic) IBOutlet UISegmentedControl * sgmTopMenu;
@property (retain,nonatomic) IBOutlet UIImageView * imgFiles;
@property (retain,nonatomic) NSArray * arrHrefLinks;
@property (retain,nonatomic) NSArray * arrImgLinks;
@property (retain,nonatomic) IBOutlet UITableView* tblLinks;
-(IBAction)onTopMenuTap:(id)sender;
@end
实现:
// called when UIsegment's Value changed, linked in IB
-(IBAction)onTopMenuTap:(id)sender
{
selectedSegmentIndex = ((UISegmentedControl*)sender).selectedSegmentIndex;
NSLog(@"onTopMenuTap: %i",selectedSegmentIndex);
switch (selectedSegmentIndex) {
case 0:
case 1:
tblLinks.hidden = NO;
tblLinks.delegate = self;
tblLinks.dataSource = self;
tblLinks.userInteractionEnabled = YES;
tblLinks.allowsSelection=YES;
tblLinks.allowsSelectionDuringEditing = YES;
[tblLinks reloadData];
[tblLinks becomeFirstResponder];
break;
case 2: // settings
tblLinks.hidden = YES;
// tblLinks.delegate = nil;
// tblLinks.dataSource = nil;
break;
}
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
int numberOfRowsInSection=0;
switch (selectedSegmentIndex) {
case 0:
numberOfRowsInSection = arrHrefLinks.count;
break;
case 1:
numberOfRowsInSection = arrImgLinks.count;
break;
}
return numberOfRowsInSection;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
LinkCell *cell= (LinkCell*)[tableView dequeueReusableCellWithIdentifier:LINK_CELL_ID];
if (cell == nil)
cell = [[[NSBundle mainBundle]
loadNibNamed:LINK_CELL_ID
owner:self
options:nil] lastObject];
// Setting up the cell...
HTMLNode * node = nil;
NSString * header = nil;
switch (selectedSegmentIndex) {
case 0:
node = [arrHrefLinks objectAtIndex:[indexPath row]];
header = [node getAttributeNamed:@"title"];
if (!header || header.length==0)
header = [node contents];
if (!header || header.length==0)
header = [node allContents];
if (!header || header.length==0)
[node getAttributeNamed:@"name"];
cell.lblName.text = header;
//cell.textLabel.text = header;
cell.lblUrl.text = [node getAttributeNamed:@"href"];
break;
case 1:
node = [arrImgLinks objectAtIndex:[indexPath row]];
header = [node getAttributeNamed:@"title"];
if (!header || header.length==0)
[node getAttributeNamed:@"name"];
if (!header || header.length==0)
header = [node contents];
if (!header || header.length==0)
header = [node allContents];
cell.lblName.text = header;
//cell.textLabel.text = [header copy];
cell.lblName.text = [node getAttributeNamed:@"name"];
//cell.lblUrl.text = [node getAttributeNamed:@"src"];
break;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"didSelectRowAtIndexPath");
}
答案 0 :(得分:2)
我找到了问题的来源。这是PSWebView。它被放置在第一个标签的视图中,但似乎它拦截了任何其他控制器中的所有水龙头。摆脱它解决了我的问题。 BTW PSWebView不使用手势,所以问题不在于手势。
答案 1 :(得分:0)
你必须编写代码来取消选择该行,否则它将保持被选中。我认为这是你的问题的原因。所以这样做
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}