다른 UIViewController에서 UIViewController를 표시해야하기 때문에이 오류가 발생합니다. 자기 (SKScene)는 UIViewController에 없기 때문에 그래서
self.presentViewController(...)
이 작동하지 않습니다. SKScene에서 선물 하시려면
view?.window?.rootViewController?.presentViewController(fShare!, animated: true, completion: nil)
더 이상 이러한 API를 사용하지 말 것을 권장합니다. 공유 요구에 UIActivityViewController를 사용하는 것이 좋습니다. 이 방법으로 앱에 하나의 공유 버튼 만 있으면되며 모든 종류의 서비스 (이메일, Twitter, Facebook, iMessage, WhatsApp 등)에 공유 할 수 있습니다.
새로운 Swift 파일을 만들고이 코드를 추가하십시오.
enum ShareMenu {
static func open(text: String, image: UIImage?, appStoreURL: String?, from viewController: UIViewController?) {
guard let viewController = viewController, let view = viewController.view else { return }
// Activity items
var activityItems = [Any]()
// Text
activityItems.append(text)
// Image
if let image = image {
activityItems.append(image)
}
/// App url
if let appStoreURL = appStoreURL {
let items = ActivityControllerItems(appStoreURL: appStoreURL)
activityItems.append(items)
}
// Activity controller
let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
// iPad settings
if UIDevice.current.userInterfaceIdiom == .pad {
activityController.modalPresentationStyle = .popover
activityController.popoverPresentationController?.sourceView = view
activityController.popoverPresentationController?.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)
activityController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.init(rawValue: 0)
}
// Excluded activity types
activityController.excludedActivityTypes = [
.airDrop,
.print,
.assignToContact,
.addToReadingList,
]
// Present
DispatchQueue.main.async {
viewController.present(activityController, animated: true)
}
// Completion handler
activityController.completionWithItemsHandler = { (activity, success, items, error) in
guard success else {
if let error = error {
print(error.localizedDescription)
}
return
}
// do something if needed
}
}
}
// MARK: - Activity Controller Items
/**
ActivityControllerItems
*/
private final class ActivityControllerItems: NSObject {
// MARK: - Properties
/// App name
fileprivate let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "-"
/// App store web url
fileprivate let appStoreURL: String
// MARK: - Init
/// Init
fileprivate init(appStoreURL: String) {
self.appStoreURL = appStoreURL
super.init()
}
}
// MARK: - UIActivityItemSource
/// UIActivityItemSource
extension ActivityControllerItems: UIActivityItemSource {
/// Getting data items
/// Placeholder item
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
/// Item for actity type
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
return URL(string: appStoreURL) ?? appName
}
/// Provide info about data items
/// Subject field for services such as email
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivityType?) -> String {
return appName
}
}
공유 버튼을 누를 때보다 당신은 그것을 공유 서비스에 따라, 이미지와 appStoreURL 사방에 표시되지 않습니다 마음에 너무
ShareMenu.open(
text: "Can you beat my score?",
image: UIImage(...), // set to nil if unused
appStoreURL: "your iTunes app store URL", // set to nil if unused
from: view?.window?.rootViewController
)
곰처럼 호출 할 수 있습니다.
또한 현장에서 점수 값을 사용할 수 있으며,이
사용중인 코드 (관련 부분)를 게시하십시오. 그러나 일반적으로 적절한 뷰 컨트롤러에서 뷰 컨트롤러 종속 메서드를 지정하고 해당 메서드를 호출 할 때 장면에서 알림을 게시 할 수 있습니다. – Whirlwind
'else if' 블록의 코드는 알림을 게시 할 수있는 코드로 대체되어야합니다. 또한 필수 구성원 메소드가 있고 해당 통지를 수신하는 적절한보기 제어기로 이동되어야합니다. – Whirlwind
잘 모르겠다. 내가 만든 사용자 정의보기 컨트롤러 클래스로 코드를 옮겼지만, 여전히 내 장면에서 코드를 호출 할 수 없다. – Matt