如何在 SWIFT 中从 UIView 实例化 ViewController

how to instantiate ViewController from UIView in SWIFT

我正在尝试从我的 UiView 初始化视图控制器。但是我在行 self.presentViewController(vc, animated: true, completion: nil) 上收到错误。单击 table 行后,我试图显示另一个视图控制器。我已经初始化故事板了。

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 (see Apple doc here).

您的 UIView 可能位于 UIViewController 管理的视图层次结构中。
一个解决方案是使用对该父 UIViewController 的引用并对其调用 presentViewController:animated:completion:

但是..我完成了使用委托将 id 从 UIView 传递到 UIViewController 并检查我从 UIViewController ViewController class 实例化的 id正如帕拉在他的回答中所说。我是这样做的

步骤:

1) 首先创建协议

2) 创建一个符合协议的变量委托

3)然后创建回调方法

//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")                
            }      
        }
    }

步骤继续 Class:

4) 遵守协议SendIndexDelegate(所以方法sendIndex(Int)必须通过这个class)

5) 在可选变量delegate中的variable delegate中赋值self(表示我将作为Class CustomSwipeView的delegate并实现方法sendIndex(Int))

6) 现在实现方法并添加body(因为已经委托所以必须通过回调方法处理上面class的动作)

    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")                

            }      

        }