【问题标题】:UIButton Action doesn't call in Swift?UIButton Action 不会在 Swift 中调用?
【发布时间】:2016-08-28 00:36:45
【问题描述】:

在我的项目中,我创建了左视图和右视图,它动态显示两个不同的视图,左视图侧创建 firstView,FirstView 内部显示标题、评论、图像和视频。并且 RightView 侧在显示标题、评论、图像和视频中创建 secondView。图片和视频仅显示部分视图。该设计完全以编程方式创建,我的设计如下所示,

我的问题是播放按钮(UIButton) Action not Called 为什么?

我不知道, 我的代码如下,UIButton 名称:btnPlay,动作名称:buttonAction:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollViewBase: UIScrollView!
    var leftView = UIView()
    var rightView = UIView()

    var wholeYLeft = CGFloat()
    var wholeYRight = CGFloat()
    let btnPlay = UIButton()

    var myArrayOfDict: NSArray = [
        ["Title": "MacBook", "Text": "Our goal with MacBook was to do the impossible: engineer a full-sized experience into the lightest and most compact Mac notebook ever. That meant reimagining every element to make it not only lighter and thinner but also better.", "Image":"MacBook1","video":""],
        ["Title": "OS X", "Text": "OS X is the operating system that makes it possible to do all the things you do on a Mac.", "Image":"","video":""],
        ["Title": "MacBook Pro", "Text": "Now with the force Touch trackpad,longer battery life and faster flash storage", "Image":"MacBookPro1","video":""],
        ["Title": "Mac Mini", "Text": "Mac mini is an affordable powerhouse that packs the entire Mac experience into a 19.7cm-square frame. Just connect your own display, keyboard and mouse, and you’re ready to make big things happen.", "Image":"Mini","video":""],
        ["Title": "iMac", "Text": "The idea behind iMac has never wavered: to craft the ultimate desktop experience. The best display, paired with high-performance processors, graphics and storage ", "Image":"","video":""],
        ["Title": "MacBook Air", "Text": "The 11-inch MacBook Air lasts up to 9 hours between charges and the 13-inch model lasts up to an incredible 12 hours. So from your morning coffee till your evening commute, you can work unplugged.", "Image":"VideoThumn","video":"Official Apple MacBook Air Video YouTube.mp4"]
    ]


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

        self.title = "Dynamic Cell"


        leftView.frame = CGRectMake(0, 0, self.view.frame.width/2, self.view.frame.height)
        rightView.frame = CGRectMake(self.view.frame.width/2, 0, self.view.frame.width/2, self.view.frame.height)

//        leftView.backgroundColor = UIColor.lightGrayColor()
//        rightView.backgroundColor = UIColor.grayColor()

        self.scrollViewBase.addSubview(leftView)
        self.scrollViewBase.addSubview(rightView)

        self.callViewMethod()
    }

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

    func callViewMethod() {

        var yFloatLeft : CGFloat! = 5

        var yFloatRight : CGFloat! = 5

        wholeYLeft = 0
        wholeYRight = 0

        for var i = 0; i < myArrayOfDict.count; i++ {

            let isCheckImage = myArrayOfDict[i].valueForKey("Image") as! String
            let isCheckVideo = myArrayOfDict[i].valueForKey("video") as! String

            let str = myArrayOfDict[i].valueForKey("Text") as? String

            let boundingRectHeight = str!.boundingRectWithSize(CGSizeMake(self.leftView.frame.width-10, CGFloat.max),
                options:NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: UIFont(name: "Arial", size: 14.0)!], context:nil).size.height + 60.0


            if(i%2 == 0) {
                let firstView = UIView()
                print(yFloatLeft)
                if(isCheckImage == "") {
                    firstView.frame = CGRectMake(5, yFloatLeft, self.leftView.frame.width-10, 30 + boundingRectHeight)
                } else {
                    firstView.frame = CGRectMake(5, yFloatLeft, self.leftView.frame.width-10, 180 + boundingRectHeight)
                }

//                firstView.backgroundColor = UIColor.redColor()
                firstView.layer.borderWidth = 2.0
                firstView.layer.borderColor = UIColor.lightGrayColor().CGColor
                leftView.addSubview(firstView)

                let lblTitle = UILabel()
                lblTitle.frame = CGRectMake(0, 0, self.leftView.frame.width-10, 30)
                lblTitle.textAlignment = NSTextAlignment.Center
                lblTitle.text = myArrayOfDict[i].valueForKey("Title") as? String

                let lblText = lblInset()
                lblText.frame = CGRectMake(0, 30, self.leftView.frame.width-10, boundingRectHeight)
                lblText.text = myArrayOfDict[i].valueForKey("Text") as? String
                lblText.numberOfLines = 0
                lblText.lineBreakMode = .ByWordWrapping
                lblText.font = UIFont(name: "Arial", size: 16)
                lblText.textAlignment = NSTextAlignment.Justified

                let mainImageView = UIImageView()

                if(isCheckImage == "") {
                    mainImageView.hidden = true
                    yFloatLeft = yFloatLeft + 30 + boundingRectHeight + 10

                } else {
                    mainImageView.hidden = false
                    mainImageView.frame = CGRectMake(0, 30 + boundingRectHeight, self.leftView.frame.width-10, 150)
                    mainImageView.image = UIImage(named: (myArrayOfDict[i].valueForKey("Image") as? String)!)

                    if(isCheckVideo == "") {
                        btnPlay.hidden = true
                    } else {
                        btnPlay.hidden = false
                        btnPlay.frame = CGRectMake((mainImageView.frame.width/2)-10, (mainImageView.frame.height/2)-10, 30, 30)
                        btnPlay.backgroundColor = UIColor.blackColor()
                        btnPlay.userInteractionEnabled = true
                        btnPlay.addTarget(self, action: "buttonAction:", forControlEvents: .TouchUpInside)
                        btnPlay.setImage(UIImage(named: "Play"), forState: .Normal)
                        mainImageView.addSubview(btnPlay)

                    }
                    yFloatLeft = yFloatLeft + 30 + boundingRectHeight + 160
                }


                firstView.addSubview(lblTitle)
                firstView.addSubview(lblText)
                firstView.addSubview(mainImageView)
                firstView.bringSubviewToFront(btnPlay)

            } else {
                let secondView = UIView()
                if(isCheckImage == "") {
                    secondView.frame = CGRectMake(5, yFloatRight, self.rightView.frame.width-10, 30 + boundingRectHeight)
                } else {
                    secondView.frame = CGRectMake(5, yFloatRight, self.rightView.frame.width-10, 180 + boundingRectHeight)
                }

//                secondView.backgroundColor = UIColor.purpleColor()
                secondView.layer.borderWidth = 2.0
                secondView.layer.borderColor = UIColor.lightGrayColor().CGColor
                rightView.addSubview(secondView)

                let lblTitle = UILabel()
                lblTitle.frame = CGRectMake(0, 0, self.leftView.frame.width-10, 30)
                lblTitle.textAlignment = NSTextAlignment.Center
                lblTitle.text = myArrayOfDict[i].valueForKey("Title") as? String

                let lblText = lblInset()
                lblText.frame = CGRectMake(0, 30, self.leftView.frame.width-10, boundingRectHeight)
                lblText.text = myArrayOfDict[i].valueForKey("Text") as? String
                lblText.numberOfLines = 0
                lblText.lineBreakMode = .ByWordWrapping
                lblText.font = UIFont(name: "Arial", size: 16)
                lblText.textAlignment = NSTextAlignment.Justified

                let mainImageView = UIImageView()

                if(isCheckImage == "") {
                    mainImageView.hidden = true
                    yFloatRight = yFloatRight + 30 + boundingRectHeight + 10

                } else {
                    mainImageView.hidden = false
                    mainImageView.frame = CGRectMake(0, 30 + boundingRectHeight, self.leftView.frame.width-10, 150)
                    mainImageView.image = UIImage(named: (myArrayOfDict[i].valueForKey("Image") as? String)!)

                    if(isCheckVideo == "") {
                        btnPlay.hidden = true
                    } else {
                        btnPlay.hidden = false
                        btnPlay.frame = CGRectMake((mainImageView.frame.width/2)-10, (mainImageView.frame.height/2)-10, 30, 30)
                        btnPlay.userInteractionEnabled = true
                        btnPlay.backgroundColor = UIColor.blackColor()
                        btnPlay.setImage(UIImage(named: "Play"), forState: .Normal)
                        btnPlay.addTarget(self, action: Selector("buttonAction:"), forControlEvents: .TouchUpInside)
                        mainImageView.addSubview(btnPlay)
                    }


                    yFloatRight = yFloatRight + 30 + boundingRectHeight + 160
                }


                secondView.addSubview(lblTitle)
                secondView.addSubview(lblText)
                secondView.addSubview(mainImageView)
                secondView.bringSubviewToFront(btnPlay)

            }

            wholeYLeft = yFloatLeft
            wholeYRight = yFloatRight
        }
        print(wholeYLeft)
        print(wholeYRight)
        leftView.frame = CGRectMake(0, 0, self.view.frame.width/2, wholeYLeft)
        rightView.frame = CGRectMake(self.view.frame.width/2, 0, self.view.frame.width/2, wholeYRight)

        if(wholeYRight > wholeYLeft) {
            self.scrollViewBase.contentSize = CGSize(width:self.view.frame.width, height: wholeYRight)
        } else {
            self.scrollViewBase.contentSize = CGSize(width:self.view.frame.width, height: wholeYLeft)
        }

    }

    func buttonAction(sender:UIButton!) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewControllerWithIdentifier("PlayViewController") as! PlayViewController

        controller.lblTitle.text = myArrayOfDict[5].valueForKey("Title") as? String
        controller.lblComments.text = myArrayOfDict[5].valueForKey("Text") as? String

        self.presentViewController(controller, animated: true, completion: nil)
    }
}

【问题讨论】:

  • 我正在做类似的事情。你的代码中的 lblInset 是什么?
  • UILabel 的自定义类
  • 太棒了。感谢您的帮助

标签: ios uibutton swift2


【解决方案1】:

我得到了答案,在UIButton (btnPlay) 添加子视图给UIImageView,我的问题是mainImageView.addSubview(btnPlay),所以将子视图更改为UIView 而不是UIImageView 正确代码是

secondView.addSubview(btnPlay)
secondView.bringSubviewToFront(btnPlay)

它对我有用

【讨论】:

    【解决方案2】:

    您必须标记按钮,然后它才能识别是哪个按钮

    btnPlay.tag = 1               
    

    【讨论】:

      【解决方案3】:

      您必须为动态创建的 Imageview 启用用户交互,所以在后面多写一行,

      let mainImageView = UIImageView()
      mainImageView.userInteractionEnabled = true
      

      希望这会奏效。

      【讨论】:

      • 我已经给了userInteractionEnabled,但它没有被调用
      • 好的。但是你已经把它交给了 UIButton。这是给 imageView 的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多