tableView didSelectRowAtIndexPath 在 iOS 7 上无法正常工作。为什么?

2024-02-09

首先我想说我只是提出这个问题,因为我想了解发生了什么。

我在 Xcode5 上全新安装时打开了一个旧的 Xcode 项目(一个非常简单的项目)。 当我意识到它在 iOS 7 上不起作用时。为什么?不知道..

我看到了一些其他问题,没有得到任何有用的答案,所以我做了一个简单的测试。 在里面UITableViewController一切正常,除了didSelectRowAtIndexPath

一探究竟

根视图控制器.h:

@interface RootViewController : UITableViewController

@property (strong, nonatomic) NSMutableArray *items;
@end

根视图控制器.m 在 viewDidLoad 中,我初始化了数组(使用一些字符串)。

实现 dataSource 和 delegate 方法(是的,我将 delegate 和 dataSource 设置为 tableView)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_items count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [_items objectAtIndex:indexPath.row];

    return cell;
}

问题就在这里:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:NO];

    detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}

DetailViewController是一个简单的 UIViewController:

(是的,我在 nib 文件上设置了 IBOutlet)

@interface DetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *detailLabel;

@end

问题是这在iOS7上不起作用,标签在DetailViewController没有更新。我尝试在之前和之后设置标签文本pushViewController.

这适用于所有以前版本的 iOS。

为什么不能在 iOS 7 上运行?

我让这个工作的唯一方法是,就像我看到的这另一个问题 https://stackoverflow.com/a/18990719/810661:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];

    dispatch_async(dispatch_get_main_queue(), ^{
        detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
    });
}

有人可以帮助我了解这里发生了什么吗?

Thanks!

_

EDIT

它也像这样工作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];

    if (detailViewController.view) {
        // do notihing
    }
    detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}

当您设置 UILabel 的值时,视图尚未加载,因此如果您检查调试,您可能会发现detailLabel为nil。

为什么不在自定义 init 方法中传递值?例如

- (id)initWithDetails:(NSString *)detailsText;

然后在viewDidLoad中,赋值?

根据您的编辑,回答您关于其为何起作用的问题:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    TestViewController *test = [[testViewController alloc] init];

    NSLog(@"Before: %@", test.label);

    if(test.view){}

    NSLog(@"After: %@", test.label);

    [[test label] setText:@"My Test"];

    [self.navigationController pushViewController:test animated:YES];
}

我已经模拟了您的场景,如果您访问 ViewController 上的“视图”,如果视图不存在,它将调用 viewDidLoad 。现在你的 UILabel 已经设置好了。这是控制台的输出。

2013-10-11 16:21:04.555 test[87625:11303] Before: (null)
2013-10-11 16:21:04.559 test[87625:11303] After: <UILabel: 0x75736b0; frame = (148 157; 42 21); text = 'Label'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7573740>>

我建议使用自定义 init 方法,而不是这种方法 - 上面的示例是一个 hack。使用类似的东西

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    testViewController *test = [[testViewController alloc] initWithText:@"My Test"];

    [self.navigationController pushViewController:test animated:YES];
}

如果您不想使用自定义初始化程序,我建议您在 DetailViewController 上使用 NSString 类型的公共属性。在调用 init 后使用您的方法进行分配。然后在 DetailViewController 中,在 viewDidLoad 或出现中,将 IBOutlet 设置为包含 NSString 的属性的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tableView didSelectRowAtIndexPath 在 iOS 7 上无法正常工作。为什么? 的相关文章

随机推荐

  • 获取图表js条形图来填充窗口

    我有一个chart js在画布内绘制的条形图
  • ASP.NET MVC 2 重新加载页面而不刷新并保持 URL 变化

    我正在使用 ASP NET MVC 创建一个项目 我想在占位符中显示页面内容而不刷新页面 类似于 ajax 但随着 URL 的变化 我怎样才能完成这个 谢谢你的回复 如果您更改浏览器的 url 这将自动执行重定向并刷新整个页面 您可以使用井
  • Page.IsValid 和 args.IsValid 之间有什么关系

    Page IsValid 和 args IsValid 是否相互依赖 我的意思是 如果 args IsValid true 则 Page IsValid 必须为 true 当然 反之亦然 如果 Page IsValid true 那么 ar
  • 尾随零不会进入数据库

    所以这是我的问题 我们试图将定价放入我们的数据库中 但由于某种原因 它将 10 00 转换为 10 或 10 50 转换为 10 5 它保持它只是砍掉尾随零 我检查了 SQL 语句 它说价格 10 00 所以我真的很困惑为什么 在哪里它要剥
  • 黄瓜嵌入的屏幕截图不链接到屏幕截图

    从 Cukes Google Group 交叉发布 我尝试过多种保存截图的方法 但最终选择了 watir webdriver 中内置的方法 不 无论我使用哪种方法 我都无法成功嵌入 Cucumber HTML 报告中此图像的链接 在 c r
  • ggplot2 在函数或 S4 中使用时产生错误

    当在 function 或 S4 中使用 ggplot2 时 我遇到了困难 这是我的没有功能的代码 rm list ls all TRUE library nlme data Oats Data lt Oats Data Env lt fa
  • 当“以管理员身份运行”时,实例化 COM 组件失败并显示“类未注册”

    实例化 COM Interop 对象时 var comObj new ComComponentClass 我得到了COMException Retrieving the COM class factory for component wit
  • CocoaLumberjack FileLogger 记录到多个文件

    我正在使用这个 CocoaLumberjack 框架来记录 Objective C 设计中的所有消息 现在我想将所有错误记录到一个文件 并将所有其他消息记录到另一个文件 我知道我可以使用格式化程序来过滤这些信息 我在 AppDelegate
  • 实现 TextWriter 的派生类

    我有两个类 我无法以任何方式更改它们 第 1 类 采取TextWriter作为构造函数参数并将其用作输出流 类2 提供方法WriteLine string 我需要一个适配器 以便将 Class1 的所有输出写入 Class2 因此我启动了一
  • Builder 与 GlobalKey

    与构建 Flutter UI 相关的许多问题都归结为错误BuildContext 例如显示SnackBar 答案通常是使用Builder或使用GlobalKey 两者都有效 但我注意到文档全局密钥 https docs flutter io
  • 如何使用命令机器人框架执行bat文件(.bat)?

    我有一个 脚本文件 我想在机器人框架中执行这个脚本 我也在尝试这个 但对我来说没有任何作用 Run CURDIR script script bat 有人可以帮我吗 Use 工艺库 http robotframework org robot
  • 删除 SQL 表中的树节点

    我正在尝试编写一个递归过程 该过程将删除该节点及其所有子节点 如果它们在表中 我尝试执行以下操作 CREATE PROCEDURE DeleteFile FileID INTEGER UserID VARCHAR MAX AS DELETE
  • AG 网格 - 禁止在特定列/单元格内选择行

    使用 AG 网格 我需要制作一个在单击时选择行的表格 但是单击某些单元格不会导致选择该行 到目前为止 我最好的想法是当鼠标悬停在非选择单元格上时禁用单击行选择 就像是 gridOptions onCellMouseOver event gt
  • 命名空间“Mvc”的类型在命名空间“Microsoft.AspNet”中不存在

    我正在 Visual Studio 2015 中开发 MVC 项目 最初在 VS 2013 中创建 一切都构建正确 但在编码时 视图显示很多错误 ViewBag Title Index Layout Views Shared Layout
  • 如何使用批处理文件编辑特定的组策略

    我在一个学区的 700 多台计算机上工作 并编写了一个小程序 我打算将其写入 CD 该程序设置为插入磁盘时自动运行 并提示计算机的屏幕分辨率以及建筑物所在的计算机 不同的教学楼 然后 程序将运行一个批处理文件 将默认桌面从磁盘复制到 win
  • 在生产环境中部署 ReactJS 应用程序(使用 NodeJS 后端)

    我们的项目现已结束 我们只有两周的时间将项目归还给我们大学最后一年的学习 我们的老师告诉我们 现在开发阶段已经结束 我们必须将其部署到生产阶段 我们使用 ReactJS 作为前端 托管在 localhost 3000 使用 NodeJS 进
  • 对不同集合上匹配 id 的对象数组进行排序

    我有一个对象数组 array id 5 name Helen age 20 id 15 name Lucy age 30 id 7 name Carlos age 1 然后我有一个类似的数组 以不同的方式排序 arraySorted id
  • Google 云容器构建器并不总是从 bitbucket 触发

    我在 Google Cloud Container Builder 中设置了构建触发器 这些触发器设置为在特定分支上触发并使用存储库中的 cloudbuild yml 配置 大约在我将提交推送到这些分支的第一天 它触发了容器构建并成功完成
  • 使用 Go 将数据发送到 Datadog

    我使用 Go 收集数据并希望将其可视化 我选择了 Datadog 但没有找到 Go 用于向 Datadog 发送指标的示例或实时项目 但官方网站说支持Go 第一步是在运行应用程序的服务器上安装 DataDog 代理 https docs d
  • tableView didSelectRowAtIndexPath 在 iOS 7 上无法正常工作。为什么?

    首先我想说我只是提出这个问题 因为我想了解发生了什么 我在 Xcode5 上全新安装时打开了一个旧的 Xcode 项目 一个非常简单的项目 当我意识到它在 iOS 7 上不起作用时 为什么 不知道 我看到了一些其他问题 没有得到任何有用的答