菜鸟教程小白 发表于 2022-12-13 16:11:29

ios - UIButton Action 不会在 Swift 中调用?


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

<p> <a href="/image/0bAti.png" rel="noreferrer noopener nofollow"><img src="/image/0bAti.png" alt="enter image description here"/></a> </p>

<p><strong>我的问题是播放按钮(<code>UIButton</code>) Action not Called 为什么?</strong></p>

<p><strong>我不知道,
我的代码如下,<code>UIButton</code> 名称:btnPlay, Action 名称:buttonAction:</strong></p>

<pre><code>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 = [
      [&#34;Title&#34;: &#34;MacBook&#34;, &#34;Text&#34;: &#34;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.&#34;, &#34;Image&#34;:&#34;MacBook1&#34;,&#34;video&#34;:&#34;&#34;],
      [&#34;Title&#34;: &#34;OS X&#34;, &#34;Text&#34;: &#34;OS X is the operating system that makes it possible to do all the things you do on a Mac.&#34;, &#34;Image&#34;:&#34;&#34;,&#34;video&#34;:&#34;&#34;],
      [&#34;Title&#34;: &#34;MacBook Pro&#34;, &#34;Text&#34;: &#34;Now with the force Touch trackpad,longer battery life and faster flash storage&#34;, &#34;Image&#34;:&#34;MacBookPro1&#34;,&#34;video&#34;:&#34;&#34;],
      [&#34;Title&#34;: &#34;Mac Mini&#34;, &#34;Text&#34;: &#34;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.&#34;, &#34;Image&#34;:&#34;Mini&#34;,&#34;video&#34;:&#34;&#34;],
      [&#34;Title&#34;: &#34;iMac&#34;, &#34;Text&#34;: &#34;The idea behind iMac has never wavered: to craft the ultimate desktop experience. The best display, paired with high-performance processors, graphics and storage &#34;, &#34;Image&#34;:&#34;&#34;,&#34;video&#34;:&#34;&#34;],
      [&#34;Title&#34;: &#34;MacBook Air&#34;, &#34;Text&#34;: &#34;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.&#34;, &#34;Image&#34;:&#34;VideoThumn&#34;,&#34;video&#34;:&#34;Official Apple MacBook Air Video YouTube.mp4&#34;]
    ]


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

      self.title = &#34;Dynamic Cell&#34;


      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 &lt; myArrayOfDict.count; i++ {

            let isCheckImage = myArrayOfDict.valueForKey(&#34;Image&#34;) as! String
            let isCheckVideo = myArrayOfDict.valueForKey(&#34;video&#34;) as! String

            let str = myArrayOfDict.valueForKey(&#34;Text&#34;) as? String

            let boundingRectHeight = str!.boundingRectWithSize(CGSizeMake(self.leftView.frame.width-10, CGFloat.max),
                options:NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: , context:nil).size.height + 60.0


            if(i%2 == 0) {
                let firstView = UIView()
                print(yFloatLeft)
                if(isCheckImage == &#34;&#34;) {
                  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.valueForKey(&#34;Title&#34;) as? String

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

                let mainImageView = UIImageView()

                if(isCheckImage == &#34;&#34;) {
                  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.valueForKey(&#34;Image&#34;) as? String)!)

                  if(isCheckVideo == &#34;&#34;) {
                        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: &#34;buttonAction:&#34;, forControlEvents: .TouchUpInside)
                        btnPlay.setImage(UIImage(named: &#34;Play&#34;), 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 == &#34;&#34;) {
                  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.valueForKey(&#34;Title&#34;) as? String

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

                let mainImageView = UIImageView()

                if(isCheckImage == &#34;&#34;) {
                  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.valueForKey(&#34;Image&#34;) as? String)!)

                  if(isCheckVideo == &#34;&#34;) {
                        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: &#34;Play&#34;), forState: .Normal)
                        btnPlay.addTarget(self, action: Selector(&#34;buttonAction:&#34;), 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 &gt; 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: &#34;Main&#34;, bundle: nil)
      let controller = storyboard.instantiateViewControllerWithIdentifier(&#34;PlayViewController&#34;) as! PlayViewController

      controller.lblTitle.text = myArrayOfDict.valueForKey(&#34;Title&#34;) as? String
      controller.lblComments.text = myArrayOfDict.valueForKey(&#34;Text&#34;) as? String

      self.presentViewController(controller, animated: true, completion: nil)
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我得到了一个答案,在 <code>UIButton</code> (btnPlay) 添加 subview 给 <code>UIImageView</code>,我的问题是 <code>mainImageView.addSubview(btnPlay)</code>,所以将 subView 更改为 <code>UIView</code> 而不是 <code>UIImageView</code> 正确的代码是 </p>

<pre><code>secondView.addSubview(btnPlay)
secondView.bringSubviewToFront(btnPlay)
</code></pre>

<p>它对我有用</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIButton Action 不会在 Swift 中调用?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/36996117/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/36996117/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIButton Action 不会在 Swift 中调用?