2017-07-25 58 views
2

用於拖放到UICollectionView在IOS 11貝塔4.改變處於測試1-3中的API,代碼看起來像:拖放到`UICollectionView`佔位符在IOS 11 Beta 4的

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) 

除了沒有使用佔位符,直到測試5,任何人對如何在測試4得到這個工作的任何想法?

謝謝!

回答

1

直到在Beta 5中解決這個問題,我最終通過將其放入Objective-C運行時來解決此問題。

在對象 - 頭......

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 

再從銀行代碼...

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

我有一個類似的問題,本地身份驗證沒有在模擬器架構上編譯時,它是在測試版。

如果您從構建設置中的有效體系結構中刪除arm64(或關閉「構建所有體系結構」),它會編譯嗎?

如果他們爲模擬器編譯了這個符號,但是把它留給了arm64,唯一的解決方案可能是防止它在arm64上編譯,並且現在只在模擬器上測試它。

您還可以將代碼臨時包裝在「#if block」中,以防止編譯器在構建arm64時查看它。

最後,如果您正在爲iOS 11以下的任何iOS版本構建,請務必嘗試將它們暫時關閉,以防忘記標記API可用性(這可能會讓編譯器提供更有用的消息)。

+0

不幸的是,它沒有任何工作建築。只要將它放在#if塊中就行不通了(我所有的拖放代碼都是圍繞使用佔位符設計的)。幸運的是,進入Obj-C運行時間後,它一直運行到beta 5。 –