【问题标题】:Swift Selector in UIImageWriteToSavedPhotosAlbum not recognized, why?UIImageWriteToSavedPhotosAlbum 中的 Swift 选择器无法识别,为什么?
【发布时间】:2020-10-28 11:03:15
【问题描述】:

iOS API Function UIImageWriteToSavedPhotosAlbum 将选择器作为一个参数:

func UIImageWriteToSavedPhotosAlbum(_ image: UIImage, 
                              _ completionTarget: Any?, 
                              _ completionSelector: Selector?, 
                              _ contextInfo: UnsafeMutableRawPointer?)

https://developer.apple.com/documentation/uikit/1619125-uiimagewritetosavedphotosalbum

但是,在 swift 中,当我调用此函数时,选择器永远不会被识别:

class Base {
   func save_image(img:UIImage) {
        UIImageWriteToSavedPhotosAlbum(img, self, Selector("image:didFinishSavingWithError:contextInfo:"), nil)
        // I also tried this:
        // UIImageWriteToSavedPhotosAlbum(img, self, #selector(image(_:didFinishSavingWithError:contextInfo:))
    }

   @objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        print("Photo Saved Successfully")
    }
}

class Child:Base {
}

// This is how I call the save_image function:
let child = Child()
child.save_image()

如您所见,我尝试从签名和字符串构造选择器,但都不起作用。我总是在运行时收到此错误:

'XXX.Child' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector ......

这里发生了什么?我想知道这是否是因为 swift 没有看到 Child 类的方法,因为该方法是从 Base 类继承的?

如何才能成功通过选择器?

我已阅读的相关问题:

@selector() in Swift?

【问题讨论】:

  • 你的 Swift 版本是什么?例如,如果您使用 Swift 3,则应该使用 #selector()。另外,这里有解决方案(如果你使用 Swift 3):stackoverflow.com/questions/41093735/…
  • @Larme Swift 3。我用了#selector(),也不起作用。

标签: ios swift selector


【解决方案1】:

methodSignatureForSelector 是 NSObject 的方法。 所以,你需要继承NSObject类。

class Base: NSObject {
    ...
}

【讨论】:

    【解决方案2】:

    为您的选择器提供一些指导,帮助它找到正确的功能:

    class Base {
        func save_image(img:UIImage) {
            UIImageWriteToSavedPhotosAlbum(img, self, #selector(Base.image(_:didFinishSavingWithError:contextInfo:)), nil)
        }
    
        @objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
            print("Photo Saved Successfully")
        }
    }
    
    class Child:Base {
    }
    
    // This is how I call the save_image function:
    let child = Child()
    child.save_image()
    

    【讨论】:

    • @NeoWang 对你有用吗?我有同样的问题:/
    【解决方案3】:

    在我尝试了所有之后,我发现关键的事情是:

    1. 方法签名必须匹配(很多答案已经涵盖)
    2. 不要将参数传递到错误的位置,我的失败之一是,我将target传递给contextInfo
    3. maybe 仅在 Swift 中,实现回调函数的类必须继承自 NSObject

    【讨论】:

    • SURELY -> 仅在 Swift 中,实现回调函数的类,必须继承自 NSObject
    • @ReimondHill 是的,你是对的,Objective-C 中的所有对象都继承自 NSObject,只有 Swift 中的对象可以选择
    • 第 3 步解决了我的问题,这是因为我有一个没有从 NSObject 扩展的 Swift 类。但是,我没有考虑添加@objc。不知道这是否会有所作为......
    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多