iphone - 让 Xcode 提示缺少参数

标签 iphone ios ipad cocoa-touch objective-c-blocks

我正在通过现代化我过去编写的代码来设计一个新的应用程序。这段旧代码使用类/委托(delegate)模型,我正在尝试将它们转换为使用 block 作为回调,而不是委托(delegate)的东西。

我所做的是创建一个类似的属性

@property (nonatomic, copy) void (^onTouch)(NSInteger index);

这将向使用该类的对象传递一个 block ,代码可以插入其中,在这种情况下,在触摸时执行。

但我的问题是这样的。当您使用委托(delegate)并且您在委托(delegate)协议(protocol)上有一个方法时,如果您使用该类而忘记实现委托(delegate)协议(protocol),Xcode 将发出警告。那是用 block 做的方法吗?或者换句话说:如果调用者未定义回调 block ,是否有办法让 Xcode 提示?

我的意思是这是正确的:

MyClass *obj = [[MyClass alloc] init];
obj.onTouch = ^(NSInteger *index){ //call back code to be executed };

这样也行

MyClass *obj = [[MyClass alloc] init];
obj.onTouch = nil;

但这会生成一条消息

MyClass *obj = [[MyClass alloc] init];
// no callback block defined.

这可能吗?

最佳答案

如果你想强制设置某个参数,我会将其包含在初始化程序中。

MyClass *obj = [[MyClass alloc] initWithBlock:^(NSInteger *index) { /* code*/ }];

然后,在 MyClass 中:

- (id)init {
  // This will result in a runtime error if you use the wrong initializer.
  NSAssert(NO, @"Use initWithBlock instead.");
}

- (id)initWithBlock(initWithBlock:^(NSInteger *)block) {
  self = [super init];
  if (self) {
    self.onTouch = block;
  }
  return self;
}

另请注意,尝试执行 NULL block 会导致崩溃,因此请务必执行以下操作:

if (self.onTouch) { self.onTouch(); }

无论你在哪里运行 block 。

关于iphone - 让 Xcode 提示缺少参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18946342/

相关文章:

iphone - UILabel 属性转储

ios - 当达到 iOS 开发者计划的 100 台设备限制时,我有哪些选择

ios - 以编程方式使用 Autolayout 布局自定义 UITableViewCell

ios - 解析查询在只有一个对象时发现两个对象

ios - 检测用户点击屏幕 Swift

iphone - iphone sdk中的ffmpeg集成错误?

ios - 在 IOS 中保留 html 文件的文件夹层次结构

iOS UI 自动化测试 : reusing app-data between devices

ios - xCode 6.3.1 在模拟器上运行时缺少引用

ios - 在 Root View Controller 上管理 View Controller ,如 iPad 中的 subview