12

我的 UITableView 需要单击 2 次才能显示所选单元格的详细信息页面:一次用于选择,另一次用于显示详细信息视图。我希望一个 clic 直接显示单击单元格的详细视图。

我在我的 UITableViewManager.m 中使用此方法使用模态序列:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [playerList indexPathForSelectedRow];
        TCPlayerStat *object = _objects[indexPath.row];
        [[segue destinationViewController] setPlayerStat:object];
    }
}

我不能使用 push segue,因为我没有导航控制器(也不想这样做)。

我查看了 TableView 属性检查器,但没有发现任何与此相关的内容。我选择了“单一选择”并选中了“触摸时显示选择”。我不知道这是否可能,如果可以,在哪里看..

谢谢你的帮助。


编辑 1:当我编写这样的两种方法时,它仍然不起作用(需要单击 2 次)并且我有一个新的警告日志:

“警告:尝试在演示过程中在 TCRootViewController:0xa24f050 上演示 TCDetailViewController:0xa27b900!”

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"showDetail" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [playerList indexPathForSelectedRow];
        TCPlayerStat *object = _objects[indexPath.row];
        TCDetailViewController *detailViewController = [segue destinationViewController];
        [detailViewController setPlayerStat:object];
    }
}

编辑2:我不知道为什么,但有时它工作得很好,不需要再次点击表格视图。查不出来:/


下面的解决方案

4

6 回答 6

16

我喜欢问题是什么!

我更改了 Storyboard 上不应该有的参数。我希望选择单元格在单击时不显示背景突出显示颜色,但 Segue 似乎基于它可以正常工作。

如何修复:在情节提要中,在导航器中选择您的表格视图单元格,并且不要在“选择”(属性检查器)中选择“无”选项。“蓝色”、“灰色”或“默认”似乎效果不错。

于 2013-10-23T13:41:18.230 回答
15

我已经将选择属性设置为“默认”并且仍然遇到两次单击问题。然而,该建议确实指向了一个相关的解决方案。在 didSelectRowAtIndexPath 中,调用:

self.tableView.deselectRowAtIndexPath(indexPath, animated: false)

(显然,我正在使用 Swift。)

于 2015-08-03T15:04:27.920 回答
3

我认为解决此问题的更正确方法是在主线程上执行任何操作,在您的情况下触发 segue:

Objective-C

dispatch_async(dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:@"showDetail" sender:self];
});

迅速

DispatchQueue.main.async {
    self.performSegue(withIdentifier: "showDetail", sender: self)
}

这实际上是一个错误,与主 RunLoop 和 tableViewCell 相关,而 selectionStyles 强制 RunLoop 处于唤醒状态(因为它必须处理动画),如果你没有 selectionStyle,而且你不会在呈现的内部做任何启动动画viewController,RunLoop 有时会睡着。

如果您出于某种原因不想在主线程上执行操作(在您的情况下它会触发 segue),或者您在呈现的 ViewController 上没有启动动画,您可以简单地添加空的主线程调用结束,它也会触发 RunLoop 被唤醒。

Objective-C

[self performSegueWithIdentifier:@"showDetail" sender:self];
dispatch_async(dispatch_get_main_queue(), ^{});

迅速

self.performSegue(withIdentifier: "showDetail", sender: self)
DispatchQueue.main.async {}
于 2018-12-16T19:04:23.490 回答
2

一个对我有用的解决方案(XCode 9.2)看起来很简单,但仍然允许None选择是:

正如@Tulleb 所说,在情节提要中使用除“选择”之外None的任何内容Table View Cell,然后.none在代码中将其设置为。

比如像这样...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tv.dequeueReusableCell(withIdentifier: "cell")
    cell?.selectionStyle = .none  // This is the important line
于 2018-03-29T04:31:31.173 回答
0

采用

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

代替

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

然后你可以编写任何代码,它在第一次点击时就可以工作。

于 2013-10-21T00:11:30.657 回答
0

供参考。到目前为止,对于 Xcode 8.2.1 和 Swift 3.x,我的自定义UICollectionViewCell子类也存在这个问题(但我想重现这个问题不需要子类。我没有时间测试这个案例。)。

我将问题总结为:点击先前选择的单元格将消耗点击事件导致取消选择,而不是预期触发选择序列。

因此,解决方案是,要么不使用选择转场,而是使用编程触发转场,或者在触发选择转场时取消选择单元格本身。

于 2017-01-19T10:40:43.837 回答