如何单击UI表格视图单元格(自定义单元格)中的按钮,然后转到其他viewcontroller

时间:2015-08-01 11:32:22

标签: ios swift segue tableviewcell

我有MyTableViewCell课程和他们的.xib

我的TableViewController上的

想要点击单元格内的按钮,然后转到我的其他UIViewControllerUITableViewDataSourceUITableViewDelegate

来自这个

 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

2 个答案:

答案 0 :(得分:0)

您需要为自定义单元格委派

enter image description here

enter image description here

之后你应该在单元格内的动作按钮中使用它

enter image description here

在tableView控制器中添加协议

enter image description here

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。如果您需要任何进一步的帮助,请告诉我。