拖放到 iOS 11 Beta 4 中的“UICollectionView”占位符

Drag and Drop into a `UICollectionView` placeholder in iOS 11 Beta 4

用于拖放到 UICollectionView 中的 API 在 iOS 11 Beta 4 中发生了变化。在 beta 1-3 中,代码如下所示:

let placeholderContext = coordinator.drop(
    item.dragItem,
    toPlaceholderInsertedAt: indexPath,
    withReuseIdentifier: "reuseID",
    cellUpdateHandler: { _ in }
)

在 beta 4 中,引入了 UICollectionViewDropPlaceholder。我的代码是

let placeholder = UICollectionViewDropPlaceholder(
    insertionIndexPath: indexPath,
    reuseIdentifier: "reuseID"
)

let placeholderContext = coordinator.drop(item.dragItem, to: placeholder)

我遇到这个编译错误:

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_UICollectionViewDropPlaceholder", referenced from:
      objc-class-ref in StickerLibraryViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
note: symbol(s) not found for architecture arm64
error: linker command failed with exit code 1 (use -v to see invocation)

除了在 beta 5 之前不使用占位符之外,有人知道如何在 beta 4 中使用占位符吗?

谢谢!

当模拟器架构处于测试阶段时,我遇到了一个类似的问题,即本地身份验证无法在模拟器架构上编译。

如果您从构建设置中的有效体系结构中删除 arm64(或关闭“构建所有体系结构”),它会编译吗?

如果他们为模拟器编译了这个符号,但没有为 arm64 编译它,唯一的解决办法可能是阻止它在 arm64 上编译并暂时只在模拟器上测试它。

您还可以将代码临时包装在“#if 块”中,以防止编译器在构建 arm64 时查看它。

最后,如果您正在为 iOS 11 下的任何 iOS 版本构建,请务必暂时关闭它们,以防他们忘记标记 API可用性(这可能会让编译器提供更有帮助的消息)。

在 Beta 5 中修复此问题之前,我最终通过进入 Objective-C 运行时解决了这个问题。

在 Obj-C header…

NS_ASSUME_NONNULL_BEGIN

@interface RKNFactory : NSObject

- (UICollectionViewDropPlaceholder*)placeholderForIndexPath:(NSIndexPath*)indexPath resuseIdentifier:(NSString*)reuseIdentifier;

@end

NS_ASSUME_NONNULL_END

实施中……

@import ObjectiveC.runtime;

@implementation RKNFactory

- (UICollectionViewDropPlaceholder*)placeholderForIndexPath:(NSIndexPath*)indexPath resuseIdentifier:(NSString*)reuseIdentifier {

    SEL initSelector = NSSelectorFromString(@"initWithInsertionIndexPath:reuseIdentifier:");
    Class placeholderClass = NSClassFromString(@"UICollectionViewDropPlaceholder");
    return [[placeholderClass alloc] performSelector:initSelector  withObject:indexPath withObject:reuseIdentifier];
}

@end

然后从 Swift 代码…

return RKNFactory().placeholder(for: indexPath, resuseIdentifier: reuseIdentifier)