- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 iOS 世界的新手,在尝试将值从 TableView 传回主 Controller 时遇到了问题。
我正在处理的场景是
非常感谢有关此问题的任何指示:
这就是我在家里准备 Segue 的方式
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
UIViewController *destination = segue.destinationViewController;
if ([destination respondsToSelector:@selector(setDelegate:)]) {
[destination setValue:self forKey:@"delegate"];
}
}
SecondController 有一个委托(delegate) ID,所以我假设委托(delegate)设置为“respondsToSelector
”,对于“setDelegate”返回 true
现在,在 SecondController 中,当用户选择一个项目时,我调用 didSelectRowAtIndexPath
和 viewWillDisappear
方法来设置项目并使 View 消失:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
POSAllItemsCell *cell = (POSAllItemsCell *) [tableView cellForRowAtIndexPath:indexPath];
item = [NSDictionary dictionaryWithObjectsAndKeys:cell.name, @"Name", cell.price, @"Price", cell.code, @"Code", nil];
[self dismissViewControllerAnimated:YES completion:NULL];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([delegate respondsToSelector:@selector(setSelection:)]) {
[delegate setValue:item forKey:@"selection"];
}
}
现在这里的问题是 respondsToSelector
for setSelection
返回 false 即使我的 HomeController 中确实有 setSelection 方法:
- (void) setSelection:(NSDictionary *)dict {
if (![dict isEqual:selection]) {
......
}
}
如果我的问题不清楚或格式不正确,请提前致歉。顺便说一句,这是针对带有 Xcode 4.2 的 iOS 5
最佳答案
要使委派工作,您需要这样设置:
在你的FirstViewController.h
头文件,确保你声明第二个 View Controller 符合委托(delegate) View Controller 的协议(protocol):
@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
您可以看到委托(delegate)在 < >
内。 View Controller 头文件中的符号。如果该协议(protocol)中有必需的委托(delegate)方法,如果您没有在实现文件中定义它们,Xcode 将显示警告。
然后您在 FirstViewController.m
中定义了您的委托(delegate)方法文件:
- (void)setSelection:(NSDictionary *)dict {
if (![dict isEqual:selection]) {
......
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"someSequeIdentifierHere"]) {
SecondViewController *sv = segue.destinationViewController;
sv.delegate = self;
}
}
您会注意到,而不是使用 UIViewController
在prepareForSegue
方法,你应该将它转换为实际的 View Controller ,这样你就可以设置它的属性。这样,您就不必测试 View Controller 是否响应,因为它有一个 delegate
。属性已定义或未定义(在这种情况下,您需要添加一个)。
要设置您的原始委托(delegate)协议(protocol),您通常在 SecondViewController.h
中遵循此格式文件:
@protocol SecondViewControllerDelegate <NSObject>
- (void)setSelection:(NSDictionary *)dict;
@optional
- (void)someOptionalDelegateMethodHere;
@end
@interface SecondViewController : UIViewController
@property (nonatomic, weak) id <SecondViewControllerDelegate>delegate;
@end
对于 ARC,委托(delegate)几乎总是弱定义的。
然后当你想通知SecondViewController.m
中的代表时
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self.delegate respondsToSelector:@selector(setSelection:)]) {
[self.delegate setSelection:item];
}
}
自 delegate
在 .h 文件中定义为公共(public)属性,您可以将其引用为 self.delegate
或 _delegate
但将其引用为 delegate
让我觉得你错误地将它定义为私有(private)实例变量。
关于这种类型的模式唯一一次不会响应 respondsToSelector:
是当您没有正确分配 delegate
时给你的FirstViewController
希望这对您有所帮助!
关于ios - respondsToSelector:不为委托(delegate)工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245808/
当想要在委托(delegate)对象上调用协议(protocol)方法时,希望实现相应的协议(protocol)方法,我看到开发人员首先检查 if([delegate respondsToSelect
我试图实现 swift 的替代 respondsToSelector: 语法,该语法也显示在主题演讲中。 我有以下内容: protocol CustomItemTableViewCellDelegat
我目前正在使用 -respondsToSelector:,如下所示: if (![moviePlayer respondsToSelector:@selector(currentPlaybackTim
我正在编写自己的 gridview 实现(基于 tableview 模式)。我遵循了类似于 TableView 的数据源模型,但是当我检查数据源是否响应消息时,调用总是失败。 我已经尝试放置断点并在执
据我所知 respondsToSelector: 是 NSObject Protocol 的一个方法,但是对于协议(protocol)中的所有方法,符合该协议(protocol)的类需要提供实现,但我
在 UIViewController 的一个简单子(monad)类中,我只是实现了一个选择器作为刷新 UI 的回调 -(void)afterfollowAction:(id)object{ //b
假设我们有不同的对象,它们具有相同的方法名称但具有不同的参数类型,例如:getMethod:(NSNumber*)aNumber 和 getMethod:(NSString*)aString . 如何
如果我向 NSXML Parser 发送错误的 URL,我会尝试找出我的应用程序崩溃(RSS 阅读器)的原因。我有一个 EXC_BAD_ACCESS。因此,经过一番搜索后,我发现我必须使用 Zombi
是否有来自 Objective C 的 respondsToSelector: 方法的 Android 模拟? 最佳答案 在 Java 中,您通常期望在定义方法的地方有一些接口(interface)。
我正在按照苹果的示例代码来了解如何在 iOS 7 下实现收据验证,并且它有效,除非我在 iOS 6 下运行以下代码(基本上逐字地从他们的示例中获取) NSBundle *bundle =[NSBund
我用respondsToSelector检查的方法是否必须实际存在? 如果我只在接口(interface)部分定义而没有实现怎么办?我正在研究 Objective-C 中的穷人虚拟函数。 最佳答案 首
以下行编译正常但在 iOS 8 中错误地返回 false。为什么? [[NSLayoutConstraint class] respondsToSelector:@selector(setActive
如果类响应选择器,我正在寻找以动态方式检查的可能性。 例如,我在类中有一个严格的方法名称模式,如“parse[CountryCode]Adress”。 我尝试过这样的事情: SEL selector
我试图通过在 [UIBarButtonItem appearance] 上运行 respondsToSelector 来检测特定于 iOS 6 的外观方法。但是,无论我指定什么选择器,它总是为我返回
有没有等价于-respondsToSelector:的类方法? 类似于 +respondsToSelector:? 我问的原因是因为通过在类级别实现 -respondsToSelector:,我收到编
我已经实现了一个带有可选方法的协议(protocol),并且在我想发送的调用方法中 respondsToSelector:至self.delegate在我发送消息之前,但这不会编译。失败消息是: 选择
在内部,respondsToSelector 是否不仅仅是找出 class_getInstanceMethod 是否返回非零值? respondsToSelector 本质上是 class_getIn
在内部,respondsToSelector 是否不仅仅是找出 class_getInstanceMethod 是否返回非零值? respondsToSelector 本质上是 class_getIn
我正在转换 this Swift 的 Objective-C 开源项目。它有一堆可选的代表。 @protocol BEMAnalogClockDelegate @optional - (void)c
NSObject 的“响应”方法似乎在最新版本的 Xcode 9 Beta 4、Swift 4.0 版中被破坏。 下面是在 Xcode 8 上测试的示例代码(工作正常),在 Xcode 9 上,方法“
我是一名优秀的程序员,十分优秀!