ios - block 定义在整个项目中可用,没有重复的符号错误

标签 ios objective-c uikit block

这是我定义的一个 block ,它比较 2 个 UIView:

typedef NSComparisonResult(^UITagCompareBlock)(UIView*, UIView*);

UITagCompareBlock uiTagCompareBlock = ^NSComparisonResult(UIView* a, UIView* b){

  if (a.tag < b.tag) return NSOrderedAscending;
  else if (a.tag > b.tag) return NSOrderedDescending;
  else return NSOrderedSame;
};

我按以下方式使用它来对 UIView 数组进行排序:

self.arrayOfViews = [self.arrayOfViews sortedArrayUsingComparator: uiTagCompareBlock];

一切正常,但如果我尝试将这个 block 和 typedef 定义旋转到它自己的文件中,以便我可以在整个项目中使用相同的 block ,我在编译时会遇到重复的符号错误。我怎样才能在整个项目中使用它?

最佳答案

也许你在 .h 文件中定义了 block ,所以它在每个 .m 文件中都有定义 导入这个 .h 文件?

您必须在 .h 文件中声明它:

typedef NSComparisonResult(^UITagCompareBlock)(UIView*, UIView*);
extern UITagCompareBlock uiTagCompareBlock;

并在一个 .m 文件中定义它:

UITagCompareBlock uiTagCompareBlock = ^NSComparisonResult(UIView* a, UIView* b){

  if (a.tag < b.tag) return NSOrderedAscending;
  else if (a.tag > b.tag) return NSOrderedDescending;
  else return NSOrderedSame;
};

关于ios - block 定义在整个项目中可用,没有重复的符号错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252307/

相关文章:

ios - 我可以将选项卡 View Controller 嵌入到容器 View 中吗?

iphone - Apple 推送通知未送达

ios - 模态呈现时的交互式过渡

objective-c - writeToFile:atomically 只在第一次工作

objective-c - Quicklook/QLPreviewController 委托(delegate)方法未在 iOS 10 Xcode 8 中调用

ios - 如何使用覆盖整个 View 的 map View 处理 UIScreenEdgepanGestureRecognizer?

ios - CoreData故障-如何获取数据

ios7 - UIKit 动态 : Calculating pushDirection Needed for UIPushBehavior

ios - 应用程序在运行 iOS 9.2.1 或更低版本的设备上崩溃(不是 P3 图像)

ios - 按钮在其 super View 自动居中时不起作用