当用户单击tableviewcell中的元素时,我想展示一个新的ViewController。但是,用于启动VC的标准代码不适用于Tableview单元,甚至无法在助手类中使用,因为TVC和助手类都不能提供视图控制器。
这是帮助程序类中的代码。无论放置在helperclass还是tableview单元中,它都没有启动VC的当前方法。
class launchVC {
func launchVCNamed(identifier: String) {
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
//FOLLOWING LINE HAS ERROR NO SUCH MEMBER (present)
self.present(secondVC, animated: true, completion: nil)
}
}
如何修改它以启动VC?
答案 0 :(得分:3)
通常,您应该使用委托模式或闭包将块从单元格传递回视图控制器。我更喜欢使用闭包代替委托,所以我举一个这样的例子:
class SomeCell: UITableViewCell {
var actionBlock = { }
func someActionOccured() { // some action like button tap in cell occured
actionBlock()
}
}
在视图控制器的cellForRow
中,您需要分配闭包
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SomeCell // replace cell identifier with whatever your identifier is
cell.actionBlock = { [unowned self] in
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
self.present(secondVC, animated: true, completion: nil)
}
return cell
}
答案 1 :(得分:1)
将委托添加到您的单元,并将其分配给presentingVC。见下文。
使用委托
创建从UITableViewCell继承的CustomCell。
class CustomCell: UITableViewCell {
var cellDelegate : CustomCellDelegate = nil
@IBAction func elementTapped() {
cellDelegate?.launchVC()
}
}
自定义单元委托
protocol CustomCellDelegate {
func launchVC()
}
MainViewController
class ViewController: UIViewController, UITableViewControllerDataSource, UITableViewDelegate {
IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
tableView.dataSource = self
tableView.delegate = self
}
func numberOfSections(in: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell {
// important
cell.delegate = self
return cell
}
}
}
扩展ViewController以实现协议
extension ViewContrller: CustomCellDelegate {
func launchVC() {
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
self.present(vc, animated: true, completion: nil)
}
}