我有MyTableViewCell
课程和他们的.xib
TableViewController
上的想要点击单元格内的按钮,然后转到我的其他UIViewController
,UITableViewDataSource
,UITableViewDelegate
来自这个
class OverviewViewController: UITableViewController
{
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerNib(UINib(nibName: "MyTableViewCell", bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
}
到此
class HistoryController: UIViewController , UITableViewDataSource, UITableViewDelegate{
@IBOutlet var MyTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.MyTable.registerNib(UINib(nibName: "HistoryTableViewCell", bundle: nil), forCellReuseIdentifier: "HistoryTableViewCell")
}
historyBtn
中的 MyTableViewCell
我使用那个
....
cell.historyBtn.tag = indexPath.row
cell.historyBtn.addTarget(self, action: "getHistoryList", forControlEvents: UIControlEvents.TouchUpInside)
....
我的历史记录列表方法
func getHistoryList()
{
presentViewController(HistoryController(), animated: true, completion: nil)
}
但是当转到HistoryController
时,我收到此错误:
在解包可选值时意外发现nil
MyTableView nil
答案 0 :(得分:0)
您需要为自定义单元格委派
之后你应该在单元格内的动作按钮中使用它
在tableView控制器中添加协议
tableView控制器中的将委托设置为单元格
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
cell.delegate = self;
在tableview控制器
中使用您的委托方法之后-(void)selectButtonWithDate:(NSDate *)date
{
[self.navigationController pushViewController:picker animated:YES];//or another transition code
}
P.S对不起我在Objective-c代码上的例子,但是,这只是做你想做的事情的正确方法。
答案 1 :(得分:0)
Swift解决方案:
你必须在ViewController中编写一个包含tableView的委托方法,如下所示:
protocol PushButtonDelegate {
func pushBtn()
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PushButtonDelegate {
}
在你的ViewController中你必须像这样定义函数pushBtn:
protocol PushButtonDelegate {
func pushBtn()
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PushButtonDelegate {
func pushBtn() {
let stb = UIStoryboard(name: "Main", bundle: nil)
let vc = stb.instantiateViewControllerWithIdentifier("UserSettingsVC")
self.presentViewController(vc, animated: true, completion: nil)
}
}
下一步是在TableViewCell.swift中调用委托方法,如下所示:
import UIKit
class TableViewCell: UITableViewCell {
var delegate : PushButtonDelegate?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
@IBAction func menuBtn(sender: AnyObject) {
delegate?.pushBtn()
}
}
最后一步是在ViewController的cellForRowAtIndexPath函数中设置委托,如下所示:
protocol PushButtonDelegate {
func pushBtn()
}
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PushButtonDelegate {
func pushBtn() {
let stb = UIStoryboard(name: "Main", bundle: nil)
let VC4 = stb.instantiateViewControllerWithIdentifier("UserSettingsVC")
VC4.title = "Settings"
self.presentViewController(VC4, animated: true, completion: nil)
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("tableViewCell") as! TableViewCell
cell.delegate = self
return cell
}
DONE。如果您需要任何进一步的帮助,请告诉我。