草庐IT

ios - UIButton Action 不在 Swift 中调用?

coder 2024-01-23 原文

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

我的问题是播放按钮 (UIButton) 操作未调用,为什么?

我不知道, 我的代码如下,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)
    }
}

最佳答案

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

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

对我有用

关于ios - UIButton Action 不在 Swift 中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996117/

有关ios - UIButton Action 不在 Swift 中调用?的更多相关文章

  1. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  2. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  3. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐