【发布时间】:2015-12-09 09:05:41
【问题描述】:
我面临以下问题,我已经尝试了很多。我还阅读了 Stackoverflow 中的其他问题,例如: Objective-C: Calling selectors with multiple arguments 以及关于选择器的 Cocoa 核心能力,但我正在寻找将参数变量传递给选择器的最佳方法。
-(void) runAllStatusDelegates : (SEL)selector
{
for (NSValue *val in self.statusDelegates)
{
id<StatusDelegate> delegate = val;
if ([delegate respondsToSelector:selector])
{
[delegate performSelector:selector];
}
}
}
这个方法负责调用委托中的方法。参数是一个选择器。我的问题是选择器可以有 0 - 3 个参数,如下所示。
-(void) handleBluetoothEnabled:(BOOL)aEnabled
{
if (aEnabled)
{
[self.statusDelegate bluetoothEnabled];
if (_storedPenSerialNumber != nil && ![_storedSerialNumber isEqual:kUnknownPenID])
{
[self runAllStatusDelegates: @selector(penConnected : _storedSerialNumber : _storedFirmware:)];
}
}
else
{
[self.statusDelegate bluetoothDisabled];
}
}
-(void) handleChooseDevice:(BluetoothDeviceList*)aDevices
{
NSLog(@"Handle Choose Device");
[self runAllStatusDelegates: @selector(chooseDevice:aDevices:)];
}
-(void) handleDiscoveryStarted
{
NSLog(@"Discovery Started");
[self runAllStatusDelegates: @selector(searchingForBluetoothDevice)];
[self.statusDelegate handleStatus:@"Searching for your digipen"];
}
此实现不起作用,因为 performSelector 无法识别选择器。
我还尝试使用 @selector(penConnected::) withObject:_storedSerialNumber 来实现它,但是我还必须使用其他参数来实现另一种方法,我不希望这样。 我是 Objective-c 的新手,所以我对所有可能性都不是很熟悉。
我的想法是将一个字符串和一个参数数组传递给 runAllStatusDelegates 并在该方法中构建选择器,但这是最好的方法还是有更方便的方法?
【问题讨论】:
-
传递给它一个数组或字典?
-
我很好奇你为什么使用选择器而不是显式调用函数?
-
我在不同的控制器中使用相同的委托。我有一个带有这些委托的 HashTable,我想调用一个方法来执行所有委托。这就是我运行AllStatusDelegates 的原因。我不想通过调用不同的 runAllStatusDelegates 方法或显式调用每个控制器中的每个函数来破坏这种简单性。
-
不,但是简单地遍历所有委托并显式调用函数会更安全吗?比必要的更复杂的 NSInvocation 需要更多的代码
标签: ios objective-c