UICollectionView 无法在 ViewController.swift 中使用 IBOutlets
UICollectionView Can't use IBOutlets in ViewController.swift
我按照随附的指南创建静态 UICollectionView,但现在我想向每个单元格添加按钮并更改按钮上的文本,例如。我无法执行此操作并收到错误 "UIButton is invalid. Outlets cannot be connected to repeating content." 如何解决此问题并在不离开 ViewController 的情况下将 IBOutlets 与单元格中的对象一起使用?
如果我需要离开 ViewController 请详细描述过程,因为我是初学者,对不同的观点不太了解 类。
谢谢!!
您应该创建 UICollectionViewCell
的子 class,并在 class 上添加您的 IBOutlets,而不是按钮和视图控制器之间的出口。
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet var myButton: UIButton!
}
然后,在 Interface Builder 中,将此子 class 设置为单元格的 class(在身份检查器窗格中)。
然后您应该能够创建从按钮到电池的插座连接。
我希望这已经足够清楚了。如果没有,请告诉我!
示例代码
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet var myButton: UIButton!
}
class MyViewController: UIViewController, UICollectionViewDataSource {
@IBOutlet var myCollectionView: UICollectionView!
private var isMyButtonEnabled = true
// Other view controller code
func disableMyButton() {
self.isMyButtonEnabled = false
self.myCollectionView.reloadData()
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = ... as! MyCollectionViewCell // Get cell
// Other cell setup
cell.myButton.isEnabled = self.isMyButtonEnabled
return cell
}
}
为您的 collection 视图定义 class 如下:
class MyCollectionCell : UICollectionViewCell {
@IBOutlet weak var likeButton: UIButton?
}
为 collection 单元格创建 xib 并为 collection 视图使用上面的自定义 class。
现在在您的视图控制器中定义 collection 视图并实现以下委托 UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
。
class ViewController: UIViewController, UICollectionViewDataSource,
UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
collectionView?.registerNib(nib, forCellWithReuseIdentifier: "myCell")
}
//UICollectionViewDelegateFlowLayout methods
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat
{
return 4;
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
{
return 1;
}
//UICollectionViewDatasource methods
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
{
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 100
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell =
collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as MyCollectionCell
cell.likeButton.setTitle("myTitle", for: .normal)
cell.likeButton.tag = indexPath.row
cell.likeButton.addTarget(self, action: #selector(mainButton:), forControlEvents: .TouchUpInside)
return cell
}
@IBAction func mainButton(sender: UIButton) {
println(sender)
// use button tag to find out which button is clicked.
}
}
在上面的代码中,重要的方法是 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
,您可以在其中为按钮设置标签,然后使用该标签找出按下了哪个按钮,并使用该 ID 找出数据源或要执行的操作.
我按照随附的指南创建静态 UICollectionView,但现在我想向每个单元格添加按钮并更改按钮上的文本,例如。我无法执行此操作并收到错误 "UIButton is invalid. Outlets cannot be connected to repeating content." 如何解决此问题并在不离开 ViewController 的情况下将 IBOutlets 与单元格中的对象一起使用?
如果我需要离开 ViewController 请详细描述过程,因为我是初学者,对不同的观点不太了解 类。
谢谢!!
您应该创建 UICollectionViewCell
的子 class,并在 class 上添加您的 IBOutlets,而不是按钮和视图控制器之间的出口。
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet var myButton: UIButton!
}
然后,在 Interface Builder 中,将此子 class 设置为单元格的 class(在身份检查器窗格中)。
然后您应该能够创建从按钮到电池的插座连接。
我希望这已经足够清楚了。如果没有,请告诉我!
示例代码
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet var myButton: UIButton!
}
class MyViewController: UIViewController, UICollectionViewDataSource {
@IBOutlet var myCollectionView: UICollectionView!
private var isMyButtonEnabled = true
// Other view controller code
func disableMyButton() {
self.isMyButtonEnabled = false
self.myCollectionView.reloadData()
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = ... as! MyCollectionViewCell // Get cell
// Other cell setup
cell.myButton.isEnabled = self.isMyButtonEnabled
return cell
}
}
为您的 collection 视图定义 class 如下:
class MyCollectionCell : UICollectionViewCell {
@IBOutlet weak var likeButton: UIButton?
}
为 collection 单元格创建 xib 并为 collection 视图使用上面的自定义 class。
现在在您的视图控制器中定义 collection 视图并实现以下委托 UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout
。
class ViewController: UIViewController, UICollectionViewDataSource,
UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
collectionView?.registerNib(nib, forCellWithReuseIdentifier: "myCell")
}
//UICollectionViewDelegateFlowLayout methods
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat
{
return 4;
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
{
return 1;
}
//UICollectionViewDatasource methods
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
{
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 100
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell =
collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as MyCollectionCell
cell.likeButton.setTitle("myTitle", for: .normal)
cell.likeButton.tag = indexPath.row
cell.likeButton.addTarget(self, action: #selector(mainButton:), forControlEvents: .TouchUpInside)
return cell
}
@IBAction func mainButton(sender: UIButton) {
println(sender)
// use button tag to find out which button is clicked.
}
}
在上面的代码中,重要的方法是 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
,您可以在其中为按钮设置标签,然后使用该标签找出按下了哪个按钮,并使用该 ID 找出数据源或要执行的操作.