我已经看到很多关于这个主题的讨论,但没有一个在Xcode 5.x中实际工作,特别是使用ARC。我有一个简单的问题:
我需要将方法引用传递给CreateButton方法,以便在调用按钮时调用我的自定义函数,而不是通用函数。
我尝试使用(SEL)类型,但这不适用于ARC。我尝试过使用& func方法,但声称我还没有宣布该功能。
所以我的需要是:
A类调用 B类并通过信息发送以制作UIButton。在该通话中,我想在参考中发送操作:方法。我确信这是常规的,但我似乎找不到iOS 7 / Xcode 5.x方法。我还回顾了O'Reilly iOS 7基础知识和食谱代码,无法在任何地方找到这个。
谢谢你的帮助。
答案 0 :(得分:3)
当我必须传递选择器时,我会将它们转换为NSStringFromSelector()
的字符串,然后返回到NSSelectorFromString()
的选择器。
传递琴弦要容易得多。您可以将它们存储在集合(数组,字典)中,序列化和反序列化它们,它们将自然地与ARC一起工作。
示例:
在您收集信息以创建按钮的A类中:
NSString *selectorString = NSStringFromSelector(@selector(yourActionMethodNameHere:));
// Gather more information needed by Class B here, then package
// it all up into a dictionary, for example
NSDictionary *buttonInfo = @{@"selectorString": selectorString, /* more stuff here */};
此时,您可以在类B中调用按钮构造方法,传递buttonInfo
,其中包含该帮助方法所需的所有信息,包括选择器。该方法可以将字符串转换回选择器并使用它,如下所示:
SEL actionSelector = NSSelectorFromString(buttonInfo[@"selectorString"]);
// configure your button to use actionSelector here
答案 1 :(得分:1)
您应该能够使用SEL参数吗?我知道我以前做过的。 ARC可能会抱怨并给你一个警告,但它不会编译失败。这只是一个警告,因为它无法弄明白该做什么记忆。
如果你真的不能让它工作,另一个选择是使用一个块,所以你可以调用你的方法
[objectA performMethodWithParam:paramA paramb:paramB completion:^{ ... do somethhing ... }];
然后在那个方法中你可以调用
completion();
而不是实际调用方法。
另一种选择是使用委托模式。创建一个定义@protocol
等方法的classADidFinish
,然后让B类实现该方法。然后将classB的实例设置为classA实例的委托,并在完成后调用该方法。
这两种方法都会阻止ARC对你呻吟。
但正如我所说,使用SEL params应该可以正常工作。有一种方法你甚至可以让编译器停止向你显示警告,但它有点难看。