2017-07-23 14 views
0

請不要將此問題標記爲重複,因爲我已嘗試過各種解決方案,但不起作用。我在我的FormViewController中創建了一個headerView(我正在使用Eureka),並且將我的視圖分離爲單獨的HeaderViews: NSObject以觀察MVC原理。我試圖添加一個buttonTarget,但它會拋出錯誤unrecognized selector sent to class。我的代碼如下:Swift:無法識別的選擇器發送到類,NSObject類中的按鈕目標

class ProfileSettingsViewController: FormViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     form +++ 

      Section(){ section in 
       section.header = { 
        var header = HeaderFooterView<UIView>(.callback({ 
         let view = HeaderViews.setUpHeaderForProfileView(user: self.user) 
         return view 
        })) 
        header.height = { 200 } 
        return header 
       }() 
      } 
     } 

在我HeaderViews:

class HeaderViews: NSObject { 

    static func setUpHeaderForProfileView(user: User) -> UIView { 
     let view = UIView(frame: CGRect(x: 0, y: 0, width: screen.width, height: 100)) 
     let changeAvatarButton = UIButton(frame: CGRect(x: (screen.width/2) - 50, y: avatarImageView.frame.maxY + 10, width: 100, height: 20)) 
     changeAvatarButton.addTarget(self, action: #selector(getAvatar(_:)), for: .touchUpInside) 
     view.addSubview(changeAvatarButton) 
     return view 
    } 

    func getAvatar(_ sender: UIButton!) { 
     print("Change Avatar tapped") 
    } 
} 

我不是很肯定,如果我做了任何錯誤,因爲我曾嘗試在這篇文章中的選擇的各種方法: Unrecognized selector sent to class

我懷疑它可能與子類NSObject有關。有什麼建議嗎?

+0

你檢查[這](https://stackoverflow.com/a/35540652/1025063)? –

+0

@Imad hm不,看不到那個帖子。好像我必須相應地重構我的代碼。謝謝。 – Koh

+0

嘗試更改操作:#selector(getAvatar(_ :))to action:#selector(getAvatar()) –

回答

0

更新 如果您無法獲得HeaderViews的實例。然後將getAvatar更改爲靜態功能。

static func getAvatar(_ sender: UIButton!) { 
    print("Change Avatar tapped") 
} 

產地 你不應該使用self作爲靜態函數的目標。 因爲這個self意味着HeaderViews。 傳遞實例作爲目標。

例:

static func setUpHeaderForProfileView(user: User, in instance: HeaderViews) -> UIView { 
    let view = UIView(frame: CGRect(x: 0, y: 0, width: screen.width, height: 100)) 
    let changeAvatarButton = UIButton(frame: CGRect(x: (screen.width/2) - 50, y: avatarImageView.frame.maxY + 10, width: 100, height: 20)) 
    changeAvatarButton.addTarget(instance, action: #selector(getAvatar(_:)), for: .touchUpInside) 
    view.addSubview(changeAvatarButton) 
    return view 
} 
+0

我不明白。什麼會喂入到FormViewController中的HeaderViews參數? – Koh

+0

如果你不能理解,試着將'getAvatar'改爲靜態。 – Codus

+0

謝謝,把它改成靜態作品 – Koh

0

如果您使用的不是UIButton的參數,定義FUNC getAvatar()不帶任何參數或FUNC getAvatar(_發件人:AnyObject)

函數調用會改變這一點。 changeAvatarButton.addTarget(自我,動作:#selector(getAvatar),用於:.touchUpInside)

我也很好奇,爲什麼不定義HeaderViews的UIView的一個子類?

這可能實際上是這裏的問題。

+0

我試過各種選擇器方法,有或沒有參數,但似乎沒有工作。我也嘗試了UIViews的子類化,也沒有解決問題。 – Koh

+0

你試過changeAvatarButton.addTarget(view ,action:#selector(getAvatar),for:.touchUpInside)? – InherentlyNuts

相關問題