如何在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
可能在由UIViewController
pipe理的视图层次结构中。
一个解决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") } }