要 Segue 还是 didSelectRowAtIndexPath?

2024-02-14

下面是我当前正在运行的代码。我有一个带有导航控制器、表格视图控制器和视图控制器的故事板设置。我正在尝试将名称从我为表设置的 NSDictionary 传递到详细视图控制器。我应该使用prepareforsegue还是didselectrowatindexpath以及如何从字典中获取名称来传递它?

#import "FMInboxViewController.h"
#import "FMDetailViewController.h"

@interface FMInboxViewController ()

@end

@implementation FMInboxViewController

@synthesize keyArray;
@synthesize tableArray;
@synthesize tblDictionary;
@synthesize filteredArray;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *ary=[[NSMutableArray alloc]init];
    [ary addObject:@"Adam"];
    [ary addObject:@"Fred"];
    [ary addObject:@"Angel"];
    // ... many similar entries
    [ary addObject:@"James"];
    [ary addObject:@"Mukthesh"];

    self.tblDictionary =[self fillingDictionary:ary];
}

表视图数据源

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [keyArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSArray *ary = [self.tblDictionary valueForKey:[keyArray objectAtIndex:section]];
    return [ary count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    NSString *cellTitle = [array objectAtIndex:[indexPath row]];
    cell.textLabel.text = cellTitle;

    // Configure the cell...

    return cell;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *title = [keyArray objectAtIndex:section];
    return title;
}

//-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//    NSString *key = [keyArray objectAtIndex:[indexPath section]];
//    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
//    self.selectedName = [array objectAtIndex:indexPath.row];
//    NSLog(@"Selected Name in Did select: %@", self.selectedName);
//    
//    [self performSegueWithIdentifier:@"showDetail" sender:self];
//}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        NSIndexPath *section = [self.tableView indexPathForSelectedRow];
        NSString *key = [keyArray objectAtIndex:section];
        NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
        NSString *cellTitle = [array objectAtIndex:[indexPath row]];
        NSLog(@"Selected Name in Did select: %@", self.selectedName);
    }
}

辅助方法

#pragma mark - Helper Methods

- (NSMutableDictionary *)fillingDictionary:(NSMutableArray *)sentArray {
    keyArray = [[NSMutableArray alloc] init];
    [keyArray removeAllObjects];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [sentArray sortUsingSelector:@selector(compare:)];
    for ( NSString *str in sentArray) {
        NSString *charVal = [str substringToIndex:1];
        NSString *charStr = [NSString stringWithString:charVal];
        NSLog(@" charStr = %@", charStr);
        if (![keyArray containsObject:charStr]) {
            NSMutableArray *charArray = [[NSMutableArray alloc] init];
            [charArray addObject:str];
            [keyArray addObject:charStr];
            [dic setValue:charArray forKey:charStr];
        }
        else {
            NSMutableArray *prevArray = (NSMutableArray *)[dic valueForKey:charStr];
            [prevArray addObject:str];
            [dic setValue:prevArray forKeyPath:charStr];
        }
    }

    return dic;
}


@end

好的,我将该部分更改为如下所示

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    self.selectedName = [array objectAtIndex:indexPath.row];
    NSLog(@"Selected Name in Did select: %@", self.selectedName);
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    FMDetailViewController *dvc = (FMDetailViewController *)segue.destinationViewController;
    dvc.name = self.selectedName;
}

但是现在,当我选择行时,第一次按时名称不会显示在详细控制器中。如果您返回并选择另一个名称,您按下的第一个名称将显示在视图控制器中。关于为什么会发生这种情况有什么建议吗?


您需要同时使用两者,在didSelectRowAtIndexPath你应该打电话[self performSegueWithIdentifier:@"identifier" sender:self];

在同一个视图控制器中你应该有prepareForSegue方法抓取destinationViewController退出 segue,然后在该视图控制器上设置您想要设置的任何属性。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.someProperty = [self.someArray objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"segueID" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vcToPushTo = segue.destinationViewController;
    vcToPushTo.propertyToSet = self.someProperty;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

要 Segue 还是 didSelectRowAtIndexPath? 的相关文章

  • 苹果推送通知在生产中不起作用

    我们完全陷入困境 请帮忙 我和我的团队制作了一个 iPhone 应用程序 这是我们第一次在 iOS 上尝试 一切都很好 直到我们提交应用程序并在应用程序商店上可用为止 推送通知服务无法正常工作 我在网上搜索并尝试根据人们的建议仔细检查我们的
  • 无法在 Windows 上使用 Gnustep 编译 Objective C

    嗨 我是初学者 学习目标c 我发现错误 hello m 1 34 Foundation Foundation h 没有这样的文件或目录 我开始知道我需要制作一个 make 文件 我可以知道如何制作 make 文件吗 无需创建 makefil
  • 在 swift3 中结合平移、alpha 和缩放动画

    我是 iOS Swift 开发的新手 我尝试将三个参数组合在一个动画中 但没有成功 我认为解决方案就在这里 Apple Dev Core 动画编程指南 https developer apple com library content do
  • 我如何获取用户的电子邮件? iPhone SDK

    我需要获取 Mail app 中使用的用户的电子邮件地址 如何使用 iPhone SDK 做到这一点 谢谢你 简短的回答 你不能 如果需要 您应该提示用户输入电子邮件地址
  • 在 iOS5 中使用 UISegmentedControl 切换 ViewController

    我正在尝试一些非常简单的事情 但不知何故我无法让它发挥作用 我尝试做的就是使用 UISegmentedControl 在 2 个视图控制器之间切换 就像您可以在 App Store 应用程序的 突出显示 选项卡中看到的那样 我正在使用 iO
  • 我可以更改键盘方向吗?

    例如我用这段代码关闭自动旋转 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation return NO BOOL sh
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • 在 iOS 上,UIView 的 Frame 属性未在动画内部分配

    在我的 iOS 应用程序中 我尝试执行以下简单的动画 void dismissToolbar NSLog bx f by f bw f bh f toolbar frame origin x toolbar frame origin y t
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • (Ionic 2)尝试回退到 Cordova-lib 执行时发生错误:TypeError:无法读取未定义的属性“then”

    Edit 使用 ionic 2 时会发生这种情况 我知道它还不稳定 但我认为可能有一些解决方案 因为其他人似乎没有遇到这个问题 Edit end 由于某种原因 我在尝试使用 ionic build android 和 ionic build
  • 两者都实现了类。将使用两者之一

    我有一个项目 它具有使用 SocketRocket 的依赖项 通过 CocoaPods 安装 并从 HeapAnalytics 导入了静态库 显然 HeapAnalytics 库已经使用了 SocketRocket 编译时没有出现错误 但在
  • 防止UIScrollView的UIPanGestureRecognizer遮挡UIScreenEdgePanGestureRecognizer

    我有一个UIScrollView它填满了我应用程序的一页上的屏幕 但我希望允许用户从屏幕边缘平移以显示其后面的视图 问题是 UIScrollView 窃取了我的触摸UIScreenEdgePanGestureRecognizer在屏幕边缘
  • “同时创建 xib 文件”按钮已禁用

    我在创建时遇到这个问题UIView s子类 创建 例如 UIViewControllers or UITableViewCells没关系 为什么会出现这种情况 I create view using cmd N and Xcode Vers
  • 尝试复制文件时出错

    我正在尝试使用 NSFileManager 将临时文件复制到另一个位置 但是它失败并抱怨其中一个文件不存在 Copy temp file NSError error BOOL exists fileManager fileExistsAtP
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • NSURL URLWithString:引发异常

    简而言之 NSURL URLWithString 似乎引发了一个例外 根据文档 如果字符串格式错误 则返回 nil 没有提到在任何情况下都会引发异常 除此之外 我还对 URL 进行编码并检查nil在将字符串转换为 URL 之前 任何人都可以
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • 用 UIView 像翻书一样翻页?

    我正在尝试在之间切换UIViews让它看起来就像你正在翻书的一页 The UIViewAnimationTransitionCurlUp如果我能让它向左或向右卷曲 那就非常接近了 这可能吗 我尝试过使用CATRansition但没有一种动画
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • 禁用segue动画

    我想在我的故事板中显示 例如推送 segues 以连接我的视图控制器和导航控制器 然后视图控制器上的导航栏将正确显示 例如 使用显示详细信息或呈现模式 导航栏将消失 但我不想继续动画 Xcode 发出如下警告 在 iOS 9 0 之前 无法
  • 相似图像 - 如何比较它们

    我有超过 130 万张图像需要相互比较 并且每天都会添加数百张图像 我的公司拍摄图像并创建一个可供我们的供应商使用的版本 这些文件通常彼此非常相似 例如 两个不同的公司可以向我们发送两个不同的图像 一个 JPG 和一个 GIF 两者都带有麦
  • 如何使这个 CSS 汉堡菜单完全可点击?

    我正在开发一个纯 CSS 汉堡菜单图标 到目前为止 它工作得很好 只是线条之间的间隙不可点击 我如何修改此代码 以便整个按钮都可单击 而不仅仅是线条 a href title Open Menu class menu a menu widt
  • 在 ColorDialog 中设置自定义颜色

    颜色对话框中的自定义颜色设置应使用以下代码设置为 Blue Blue colorDialog1 CustomColors new int System Drawing Color Blue ToArgb 0xFF0000 colorDial
  • 为什么atomic.StoreUint32比sync.Once中的普通分配更受欢迎?

    在阅读Go源码时 我对src sync once go中的代码有一个疑问 func o Once Do f func Note Here is an incorrect implementation of Do if atomic Comp
  • backbone.js:自上次服务器保存以来是否有变化?

    我有一个骨干模型 使用 model set 我可以设置本地值 使用 model save 我可以将整个模型保存到服务器 我如何知道自上次服务器保存以来是否发生了更改 这意味着本地版本是脏的 模型 isNew 仅当模型从未保存到服务器时才有效
  • TestNG - 如果满足条件,如何从 BeforeSuite 注释中强制结束整个测试套件

    如果满足 BeforeSuite 注释中的条件 是否有办法退出整个测试套件 也许有一种方法可以调用 AfterSuite 并绕过整个测试 我在 BeforeSuite 中进行数据库调用 如果查询返回任何结果 我会发送一封电子邮件 现在想要终
  • 将 spring 区域设置变量传递给 application.properties

    我已将 URL 放入 application properties 文件中 现在这些 URL 需要具有语言 以便页面以不同的语言加载 例如 在我的 application properties 文件中 我有一个 联系我们 链接的属性 如下所
  • PostgreSQL 是否像 Oracle 一样缓存准备好的语句

    在使用 Oracle 几年后 我刚刚转向 PostgreSQL 我一直在研究 PostgreSQL 数据库应用程序 Java JDBC 中准备好的语句的一些性能问题 Oracle 在其 SGA 中缓存准备好的语句 准备好的语句池在数据库连接
  • 为什么C中函数的大小总是1字节?

    当我们使用以下命令检查函数的大小时sizeof 我们总是得到1 byte 这1个字节代表什么 这是一个约束违规 你的编译器should诊断它 如果它编译它 尽管如此 你的程序有未定义的行为 感谢 Steve Jessop对失败模式的澄清 并
  • 如何使用 StyledDocument 和 HTML 进行输出?

    我有一个JTextPane 我想使用其中输出文本StyledDocument 这是我的StyledDocument object StyledDocument dox StyledDocument textArea getDocument
  • ncurses 无法识别箭头键宏

    很长一段时间以来 我一直在努力寻找解决方案 我无法让终端窗口识别键盘 这是我的代码 while 1 if cmd ERR printw Controls LEFT RIGHT and SPACEBAR Q TO QUIT if cmd St
  • 跨平台 C# 媒体 API

    我正在尝试在 mono net 对象中定义一个 VideoFile 以便我可以调用 var file new VideoFile filepath file VideoDuration 是否有一个库 操作系统或商业 可以跨平台 mono n
  • Python 3.2 - GIL - 好/坏?

    Python 3 2 阿尔法is out http python org download releases 3 2 从更改日志来看 GIL 似乎已被完全重写 几个问题 拥有 GIL 是好是坏 和 为什么 新的GIL更好吗 如果是这样 怎么
  • VBA Excel - 无法在重叠选择上使用该命令

    我的代码似乎可以工作 但它突出显示了我的最后一行代码 并显示 运行时错误 1004 无法在重叠选择上使用该命令 我尝试了在网上找到的一些各种更改 但似乎无法修复该错误 Sub Delete EEE Dim Wrds As Variant G
  • ^a-zA-Z0-9 不包括空格?

    我试图找到段落中不是 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 且不是空格 gi 的所有内容 a zA Z0 9 gi 上面的方法不行 您还可以尝试 a z
  • 单元测试中什么是正向测试和负向测试

    我对 TDD 还很陌生 我看到一些文档提到了阳性测试 阴性测试 边界测试等 有人能告诉我阳性测试和阴性测试之间的区别吗 有没有关于不同类型测试的参考资料 我不是在找书 阳性检测 通过提供有效的测试系统 数据 阴性检测 通过提供无效的测试系统
  • 在容器内运行 Chromium:libGl 错误

    我正在尝试在 docker 容器内运行 Chromium 这是我得到的输出 Created new window in existing browser session libGL error failed to open drm devi
  • 如何处理 Windows Phone 7 上的后退按钮

    在 Windows Phone 7 模拟器上 当按下硬件后退按钮时 默认行为是关闭当前应用程序 我想覆盖此默认行为 以便它导航到我的应用程序中的上一页 经过一些研究 似乎应该可以通过重写 OnBackKeyPress 方法来做到这一点 如下
  • 要 Segue 还是 didSelectRowAtIndexPath?

    下面是我当前正在运行的代码 我有一个带有导航控制器 表格视图控制器和视图控制器的故事板设置 我正在尝试将名称从我为表设置的 NSDictionary 传递到详细视图控制器 我应该使用prepareforsegue还是didselectrow