2017-10-19 90 views
0

嗨,我是新手编程和我的问题是,我有一个UICollectionViewController与4个单元格可水平滚动。在第四个单元格内,我在UIViewProfileContainerView)的顶部有一个UIButtonoptionsButton)。如何在按下CollectionViewCell中的按钮后显示ViewController

我想提出的UIViewController被称为ProfileEditViewController并设置在Main.storyboard

如何在按下此按钮后显示UIViewController

ProfileCell:

class ProfileCell: UICollectionViewCell { 

    let profileContainerView: UIView = { 
     let view = UIView() 
     return view 
    }() 

    lazy var optionsButton: UIButton = { 
     let btn = UIButton(type: .custom) 
     btn.setImage(#imageLiteral(resourceName: "Settings"), for: UIControlState.normal) 
     btn.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
     return btn 
    }() 

    @objc func handleOptionsButton() { 
     print("Button pressed") 
    } 
} 

HomeViewController:

class HomeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 


    let profileCelId = "profileCell" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupSwipeView() 
    } 


    func setupSwipeView() { 
     collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cell) 
     collectionView?.register(ProfileCell.self, forCellWithReuseIdentifier: profileCelId)   
    } 


    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   
     if indexPath.item == 3 { 
      return collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     } 
     return cell 
    } 
} 
+0

检查该代码:https://stackoverflow.com/questions/43766963/swift-action-button-inside-a-collectionviewcell – Amit

回答

0

您可以将您的ProfileEditViewController,这是在你的Main.storyboard以下方式称呼:

1)给你ProfileEditViewController一个StoryBoard ID。例如。 “ProfileEditViewController” - 关于这个问题的一些问题在这里:What is a StoryBoard ID and how can i use this?

2)在UIButton上注册UIViewController或采取相应的回调功能。 当你的HomeViewController也是您的收藏观的DataSource,你可以轻松地扩展您的数据源方法

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell` 

实现可能看起来像:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   
    if indexPath.item == 3 { 
     let profileCell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     if let _cell = cell as? ProfileCell, 
      let button = _cell.optionsButton as? UIButton { 
      button.addTarget(self, action: #selector(handleOptionsButton), forControlEvents: UIControlEvents.TouchUpInside) 
     } 
     return profileCell; 
    } 
    return cell 
} 

确保您的按钮动作现在也正在实现你的HomeViewController

@objc func handleOptionsButton() { 
    print("Button pressed") 
} 

3)现在HomeViewController.handleOptionsButton您需要提供图片ide支持转换到具有所需StoryboardID的特定控制器的功能:

let storyboard = UIStoryboard(name: "Main", bundle:Bundle.main) 
let controller = storyboard.instantiateViewController(withIdentifier: "ProfileEditViewController") 
self.present(controller, animated: true, completion: nil) 
+0

我试过了,但是它显示出'Profile'的值Cell'没有成员'存在' – Sam

+0

目前是由'UIViewControllers'实现的一个函数,请看这里:https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present。例如,您可以为Uibutton的操作注册您的UIViewController。我会调整我的答案。 – Lepidopteron

+1

好吧,我会试试这个,让你知道它是否工作。谢谢你的时间 – Sam

1

您可以使用委托来实现此目的。

下面是实现这个

protocol ProfileCollectionViewCellDelegate { 
func buttonPressedAtIndexPath(inCell: ProfileCell) 
} 

class ProfileCell: UICollectionViewCell { 

var delegate : ProfileCollectionViewCellDelegate? 
let profileContainerView: UIView = { 
    let view = UIView() 
    return view 
}() 

lazy var optionsButton: UIButton = { 
    let btn = UIButton(type: .custom) 
    btn.setImage(#imageLiteral(resourceName: "Settings"), for: UIControlState.normal) 
    btn.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
    return btn 
}() 

@objc func handleOptionsButton() { 
    if self.delegate != nil { 
     self.delegate?.buttonPressedAtIndexPath(self) 
    } 
} 
} 

为了您HomeViewController

class HomeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, ProfileCollectionViewCellDelegate { 


let profileCelId = "profileCell" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setupSwipeView() 
} 


func setupSwipeView() { 
    collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cell) 
    collectionView?.register(ProfileCell.self, forCellWithReuseIdentifier: profileCelId)   
} 


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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
    cell.delegate = self 
    return cell 
} 

fun buttonPressedAtIndexPath(inCell: ProfileCell) { 
     let indexOfCell = self.collectionView.indexPath(for: cell) 
     if indexOfCell.row == 3 { 
      //Do your work here 
     } 

} 

} 
+0

感谢您的回答我会尝试 – Sam

+0

弗兰克你尝试过吗? –

+0

对不起,我没有注意到你写过我 – Sam

0

让proCell = ProfileCell()

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cell, for: indexPath) 
    if indexPath.item == 3 { 
     let profileCell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     let button = proCell.optionsButton 
      button.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
     return profileCell; 
    } 
    return cell 
} 
相关问题