2017-02-28 55 views
1

我目前有一個UICollectionViewController來顯示我所有的新聞文章。對於我的新聞項目,我用右上角的一個小按鈕創建了一個自定義的UICollectionViewCell。Swift - UICollectionViewCell中的UIButton不可點擊

問題是隻有當我將我的feedCell設置爲isUserInteractionEnabled = true時,它才工作。我只想要newsMenu按鈕是可點擊的,而不是可以選擇整個單元格。

我該如何做到這一點?

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let feedCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! FeedCell 

    feedCell.post = m_Collection?[(indexPath as NSIndexPath).item] 

    feedCell.newsMenu.addTarget(self, action: #selector(imageTapped), for: .touchUpInside) 

    return feedCell 
} 

func imageTapped(button: UIButton) 
{ 
    let newsAction = UIAlertController(title: "Message", message: "Do you want to edit or delete this news message?", preferredStyle: .actionSheet) 

    let editAction = UIAlertAction(title: "Edit news", style: .default, handler: menuEditNews) 
    let deleteAction = UIAlertAction(title: "Delete news", style: .destructive, handler: menuDeleteNews) 
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) 

    newsAction.addAction(editAction) 
    newsAction.addAction(deleteAction) 
    newsAction.addAction(cancelAction) 

    self.present(newsAction, animated: true, completion: nil) 
} 

我的自定義單元格:

class FeedCell: UICollectionViewCell { 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    setupViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

let titleLabel: UILabel = { 
    let label = UILabel() 
    label.adjustsFontSizeToFitWidth = false 
    label.lineBreakMode = .byTruncatingTail 
    label.numberOfLines = 2 
    return label 
}() 

let profileImageView: UIImageView = { 
    let imageView = UIImageView() 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    imageView.image = UIImage(named: "") 
    imageView.layer.cornerRadius = 22 
    imageView.layer.masksToBounds = true 
    return imageView 
}() 

let newsTextView: UITextView = { 
    let textView = UITextView() 
    textView.isScrollEnabled = false 
    textView.font = UIFont (name: "Helvetica", size: 13) 
    return textView 
}() 

let newsMenu: UIButton = { 
    let newsMenu = UIButton() 
    newsMenu.isUserInteractionEnabled = true 
    newsMenu.setImage(UIImage(named: "news_menuitem"), for: UIControlState()) 
    return newsMenu 
}() 

func setupViews() { 
    backgroundColor = UIColor.white 

    addSubview(titleLabel) 
    addSubview(profileImageView) 
    addSubview(newsTextView) 
    addSubview(newsMenu) 

    addConstraintsWithFormat("H:|-8-[v0(44)]-8-[v1]-10-[v2(25)]-8-|", views: profileImageView, titleLabel, newsMenu) 
    addConstraintsWithFormat("H:|-4-[v0]-4-|", views: newsTextView) 
    addConstraintsWithFormat("V:|-6-[v0]", views: newsMenu) 
    addConstraintsWithFormat("V:|-10-[v0]", views: titleLabel) 
    addConstraintsWithFormat("V:|-8-[v0(44)]-4-[v1]", views: profileImageView, newsTextView) 
} 
} 
+0

你爲什麼不希望該全單元是可點擊?它是突出顯示的事實嗎? – Ocunidee

+0

它目前沒有突出顯示,但如果將交互設置爲true,它也會自動加載鍵盤。我可以關閉它嗎? –

+0

@DennisvanMazijk檢查我的答案,讓我知道它是否適合你。 – javimuu

回答

1

敲擊單元格時出現鍵盤的原因很可能是您實際上正在攻擊01​​,爲了防止此行爲,只需在newsTextView對象上將isUserInteractionEnabled標誌設置爲false即可。

+0

一個非常簡單的修復,但它工作:) –

0

你的代碼更改爲:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let feedCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! FeedCell 

     feedCell.post = m_Collection?[(indexPath as NSIndexPath).item] 

     feedCell.sourceController = self // assign controller 

     return feedCell 
    } 

    func imageTapped() // remove (button: UIButton) 
    { 
     let newsAction = UIAlertController(title: "Message", message: "Do you want to edit or delete this news message?", preferredStyle: .actionSheet) 

     let editAction = UIAlertAction(title: "Edit news", style: .default, handler: menuEditNews) 
     let deleteAction = UIAlertAction(title: "Delete news", style: .destructive, handler: menuDeleteNews) 
     let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) 

     newsAction.addAction(editAction) 
     newsAction.addAction(deleteAction) 
     newsAction.addAction(cancelAction) 

     self.present(newsAction, animated: true, completion: nil) 
    } 

而且你自定義單元格

class FeedCell: UICollectionViewCell { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     setupViews() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    weak var sourceController: YourController? // declare new variable 

    let titleLabel: UILabel = { 
     let label = UILabel() 
     label.adjustsFontSizeToFitWidth = false 
     label.lineBreakMode = .byTruncatingTail 
     label.numberOfLines = 2 
     return label 
    }() 

    let profileImageView: UIImageView = { 
     let imageView = UIImageView() 
     imageView.translatesAutoresizingMaskIntoConstraints = false 
     imageView.image = UIImage(named: "") 
     imageView.layer.cornerRadius = 22 
     imageView.layer.masksToBounds = true 
     return imageView 
    }() 

    let newsTextView: UITextView = { 
     let textView = UITextView() 
     textView.isScrollEnabled = false 
     textView.font = UIFont (name: "Helvetica", size: 13) 
     return textView 
    }() 

    lazy var newsMenu: UIButton = { // change `let` to `lazy var` 
     let newsMenu = UIButton() 
     newsMenu.isUserInteractionEnabled = true 
     newsMenu.setImage(UIImage(named: "news_menuitem"), for: UIControlState()) 
     newsMenu.addTarget(self, action: #selector(actionTap), for: .touchUpInside) // add target to button 
     return newsMenu 
    }() 

    func setupViews() { 
     backgroundColor = UIColor.white 

     addSubview(titleLabel) 
     addSubview(profileImageView) 
     addSubview(newsTextView) 
     addSubview(newsMenu) 

     addConstraintsWithFormat("H:|-8-[v0(44)]-8-[v1]-10-[v2(25)]-8-|", views: profileImageView, titleLabel, newsMenu) 
     addConstraintsWithFormat("H:|-4-[v0]-4-|", views: newsTextView) 
     addConstraintsWithFormat("V:|-6-[v0]", views: newsMenu) 
     addConstraintsWithFormat("V:|-10-[v0]", views: titleLabel) 
     addConstraintsWithFormat("V:|-8-[v0(44)]-4-[v1]", views: profileImageView, newsTextView) 
    } 

    func actionTap() { // handle function 
     sourceController?. imageTapped() 
    } 


} 
0

imageTapped有PARAM,所以你必須addtarget:

feedCell.newsMenu.addTarget(self, action: #selector(imageTapped(_:)), for: .touchUpInside)