于是又是著名的话题。我不得不说我已经阅读了这里所有类似的主题,也用谷歌搜索了它。但没有任何帮助。
我的应用程序的结构如下:
RootController
is TabController
,然后每个选项卡都有自己NavigationController
的ViewController
内部。在 ViewController 里面我放了一个UITableView
. 全部在 IB 中设计。DataSource
并Delegate
正确连接。TableView
使用自定义TableCell
,但我也尝试过标准TableCell
。还有一个UISegmentedControl
更改DataSource
数组
我检查并仔细检查的内容(简而言之,我在类似主题中找到的所有内容):
- my
ViewController
确实声明并实现了UITableViewDelegate
和UITableViewDataSource
(或无法在 IB 中连接相应的属性) DataSource
和Delegate
属性在 IB 中正确连接。此外,它在代码中由setDelegate:self
和重复setDataSource:self
。- 我的自定义
TableCell
已启用用户交互 - 我的自定义
TableCell
包含 2 个标签和一个图像,都没有启用用户交互标记 - 它调用
[tableView reloadData]
- 试着
[tableView becomeFirstResponder]
- TableView 具有像单个单元格选择、允许用户交互、允许在编辑时选择单元格等选项。
- 没有
didSelectRowAtIndexPath
像 DEselect 之类的错字。此外,TableView
的委托方法是从工作应用程序中复制粘贴的,并更改了方法内部的代码。我的意思是方法的名称/声明中不能有任何拼写错误。 - 该
didSelectRowAtIndexPath
方法只包含一个代码行,它是NSLog(@"didSelectRowAtIndexPath");
XCode
重启了好几次- 做了
clean all targets
- 不在
ARC
项目中使用 - 显示表格时没有繁重的操作或任何其他操作正在运行
TableView
本身在填充数据和显示数据的意义上工作得很好。但是,如果我点击单元格,它会以蓝色突出显示,看起来它会冻结选择。从它突出显示一个单元格的那一刻起,任何其他单元格都无法突出显示,并且突出显示的单元格不能被取消选择。未调用 didSelectRowAtIndexPath。但是,如果尝试通过拖动表格多次点击单元格,则有时该方法会调用。就像在极少数情况下被调用并且表中的记录不超过 3 条一样。这是一个非常奇怪的问题,我无法抗拒。我觉得 TableView 收到了水龙头,但不知何故无法处理它。
视图控制器:
@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");
}