ios - 回调方法不在 Swift 中从 UIView 调用到 ViewController

标签 ios swift callback delegates optional-chaining

我有两个类 CustomSwipOutUIView 的子类和 ViewController 的子类 em>UIViewController。委托(delegate)的回调方法 未在ViewController 类 中从 didSelectRowAtIndexPath 中定义的 TableView 委托(delegate)方法触发>CustomSwipeOut。我在 ViewController 类中完成了可选绑定(bind) var a = CustomSwipeOut(); a.delegate = ViewController()

protocol SendIndexDelegate{

    func sendIndex(Int);

}

    class CustomSwipeOut: UIView , UITableViewDataSource , UITableViewDelegate {


         var label: UILabel = UILabel()
         var myNames = ["item1","item2","item3"]
         var delegate : SendIndexDelegate?


        override init()
        {
            super.init()

        }

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

            var row = indexPath.row
            if let temp = self.delegate {

    delegate?.sendIndex(row)

    }else{

        println("optional value contains nill value")




        }

    }

// View Controller 类

    class ViewController: UIViewController , SendIndexDelegate {

        var myView :UIView = UIView()


        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.

            var a = CustomSwipeOut()
            a.delegate = ViewController()

            let rect: CGRect = CGRect (x: self.view.frame.size.width, y :50 , width:                                                 self.view.frame.size.width-100, height: self.view.frame.size.height-100)
            self.myView = CustomSwipeOut(frame : rect )
            self.view.addSubview(self.myView)

            //optional chaining


        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }


        @IBAction func showSideMenu() {

            UIView.animateWithDuration(0.2, animations:{

                self.myView.frame = CGRectMake(100,                                                                             50,self.view.frame.size.width-100,self.view.frame.size.height-100)

            } )

        }

        //delegate method
        func sendIndex(row : Int)
        {
                    switch 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)



                        println("index 2 clicked")

                        ...

                    default:
                        println("no index")


                    }


        }


    }

最佳答案

override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.

            let rect: CGRect = CGRect (x: self.view.frame.size.width, y :50 , width: self.view.frame.size.width-100, height: self.view.frame.size.height-100)
            var a = CustomSwipeOut(frame : rect)
            a.delegate = self
            self.myView = a
            self.view.addSubview(self.myView)

            //optional chaining




        }

关于ios - 回调方法不在 Swift 中从 UIView 调用到 ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096756/

相关文章:

java - 使用回调方法连接多个线程结果

javascript - 避免nodeJs中的回调 hell /将变量传递给内部函数

ios - 发送某人的 Xcode 项目

iphone - 如何将 iPhone 联系人拉入 UIWebView?

ios - 如何手动调用 viewDidLoad?

ios - 我如何构建独立的应用程序,用户可以在没有 Expo 客户端的情况下打开它

json - 如何使用 SWIFT 通过 JSON 将数据从多个 View Controller POST 到服务器

ios - 在 iOS CoreGraphics 中减小渲染 PDF 的文件大小

ios - 快速解析JSON数组

swift - 在方法A中,在方法B中从回调中获取数据?