如何在SWIFT中从UIView实例化ViewController

我想从我的UiView初始化视图控制器。 但我在线self.presentViewController错误(vc,animated:true,completion:nil)。 我试图显示另一个视图控制器后点击一个表行。 我已经初始化故事板。

import UIKit class CustomSwipeOut: UIView , UITableViewDataSource , UITableViewDelegate { var label: UILabel = UILabel() var myNames = ["item1","item2","item3"] override init(frame: CGRect) { super.init(frame: frame) self.addCustomView() } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func addCustomView() { //add blank subview to the view var blankView : UIView = UIView(frame: CGRectMake(0, 0, 300, 100)) blankView.backgroundColor = UIColor.greenColor() self.addSubview(blankView) //creating a tableview programmatically var tblView : UITableView = UITableView() tblView.frame = CGRectMake(0, 100, 300, 200) self.addSubview(tblView) tblView.delegate = self tblView.dataSource = self tblView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myCell") } //pragma mark- table view data source methods func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("myCell") as UITableViewCell cell.textLabel?.text = self.myNames[indexPath.row] return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.myNames.count } //pragma mark - table view delegate methods func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { switch indexPath.row { case 0: println("index o clicked") let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("MoneySum") as UIViewController self.presentViewController(vc, animated: true, completion: nil) case 1: println("index 1 clicked") case 2: println("index 2 clicked") default: println("no index") } } } 

presentViewController:animated:completion:是仅为UIViewController定义的方法,而不是UIView ( 请参阅Apple文档 )。

你的UIView可能在由UIViewControllerpipe理的视图层次结构中。
一个解决scheme将使用对该父UIViewController的引用,并调用presentViewController:animated:completion:就可以了。

但是,我使用委托来传递一个id从UIView到UIViewController,并检查到id我实例化ViewController从UIViewController类作为帕拉说在他的答案。 我做了如下

脚步:

1)首先创build一个协议

2)创build一个符合协议的variables委托

3)然后创build一个callback方法。

 //Step1: protocol SendIndexDelegate{ func sendIndex(Int); } class CustomSwipeView: UIView , UITableViewDataSource , UITableViewDelegate { var delegate : SendIndexDelegate? //Step2 override init(frame: CGRect) { super.init(frame: frame) self.addCustomView() } ...... func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { var row = indexPath.row //for optional binding if let temp = self.delegate { delegate?.sendIndex(row) //Step 3 }else{ println("optional value contains nill value") } } } 

另一个类继续下去:

4)符合协议SendIndexDelegate(所以方法sendIndex(Int)必须由这个类推动)

5)在variables委托中赋值self在可选variablesdelegate中(它表示我将充当类CustomSwipeView的委托并实现sendIndex(Int)方法)

6)现在实现该方法并添加主体(因为它已经委托了,所以必须通过callback方法来处理上述类的动作)

  class RootViewController: UIViewController,SendIndexDelegate //Step4 { let rect: CGRect = CGRect (x: self.view.frame.size.width, y :10 , width: self.view.frame.size.width-50, height: self.view.frame.size.height-10) var a = CustomSwipeView(frame : rect) a.delegate = self//step5 self.myView = a self.view.addSubview(self.myView) } // Step 6: func sendIndex(row : Int){ switch row { case 0: let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let moneySummaryVC: MoneySummaryVC = storyboard.instantiateViewControllerWithIdentifier("moneyVC") as! MoneySummaryVC self.navigationController?.pushViewController(moneySummaryVC, animated: true) default: println("no index") } }