2016-04-19 20 views
1

我更新了XCode之後,所以它現在可以爲iOS 9.3構建代碼,我有很多關於更新語法以符合即將到來的Swift version 3的警告。Swift #selector在子類

許多警告是關於Selector,現在我使用的是這樣的:

class Foo { 

    func registerPan() { 
     let recognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:")) 
     //do something with recognizer 
    } 

    func handlePan(recognizer:UIPanGestureRecognizer) { 
     //handle pan gesture 
    } 
} 

class Bar: Foo { 

    override func handlePan(recognizer:UIPanGestureRecognizer) { 
     //overriding handle pan gesture 
    } 
} 

所以FooBar實例都有自己的方法來處理平移手勢。 Xcode建議我改變使用選擇器的方法,使用#selector expression。編輯自動建議的變化是:

#selector(Foo.handlePan(_:)) 

這裏是我的問題。在以前的版本中,爲基類和子類調用了一個特定的實現。現在,即使對Bar類(BarFoo繼承registerPan函數)的實例,看起來函數Foo也將被調用。它是否正確?

很可能XCode靜態分析不關心繼承這裏。我正在考慮改變這些選擇到:

#selector(self.handlePan(_:)) 

所以不管類調用它自己的實現,但我想知道這是否是一個好主意,一個實例。

+0

那麼你試過了嗎? – LinusGeffarth

+0

當然,我做到了。我在問在這種情況下應該做什麼。 – pkacprzak

回答

0

由於蘋果文件說:

選擇表達,可以讓你訪問選擇用來指在Objective-C一 方法。

#selector(method name) 

的方法名稱必須是到處於 Objective-C的運行時可用的方法的參考。選擇器表達式的值是Selector類型的一個 實例。例如:

class SomeClass: NSObject { 
    @objc(doSomethingWithInt:) 
    func doSomething(x: Int) { } 
} 
let x = SomeClass() 
let selector = #selector(x.doSomething(_:)) 

..Because選擇在編譯時創建的,而不是在運行時,編譯器 可以檢查方法存在,並且該方法被 暴露於目標C運行。

您也可以使選擇的擴展您的VC(的)裏,有申報您選擇:

private extension Selector { 
    static let updateItems = #selector(CharactersListVC.updateItems) 
    static let getMoreItems = #selector(CharactersListVC.getMoreItems) 
} 

,然後只用這種方式:

button?.addTarget(self, action: .updateItems, forControlEvents: .TouchUpInside) 

希望它有助於:)

0

@pkacprzak你是正確的,只是測試了這一點。

選擇器(self。handlePan(_ :)工作正常

//這裏是代碼

class Foo:UIView { 
override init(frame: CGRect) { 
    super.init(frame: frame) 
    registerPan() 
} 
required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 
func registerPan() { 
    let recognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:))) 
    //do something with recognizer 
    self.addGestureRecognizer(recognizer) 
} 

@objc func handlePan(recognizer:UIPanGestureRecognizer) { 
    //handle pan gesture 
    print("From Base") 
} 
} 

class Bar: Foo { 
override init(frame: CGRect) { 
    super.init(frame: frame) 
} 
required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 
override func handlePan(recognizer:UIPanGestureRecognizer) { 
    //overriding handle pan gesture 
    print("From Child") 
} 
} 

這裏是它是如何叫...

override func viewDidLoad() { 
    super.viewDidLoad() 
    let bar = Bar(frame: self.view.frame) 
    self.view.addSubview(bar) 
} 
+0

代碼產生了什麼? 「從孩子」? – pkacprzak

+0

是的,它產生「從兒童」。 –

+1

不適用於iOS 10,Xcode 8,Swift 3 - 我調用超類(即打印「From Base」) – MobileMon