Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Apple iOS教程:让UIButton addTarget正常工作的问题_Swift_Uibutton_Swift3 - Fatal编程技术网

Swift Apple iOS教程:让UIButton addTarget正常工作的问题

Swift Apple iOS教程:让UIButton addTarget正常工作的问题,swift,uibutton,swift3,Swift,Uibutton,Swift3,我正在学习苹果公司提供的“开始开发iOS应用程序”教程,在这一部分我遇到了一个问题。我已经尽了一切努力让按钮打印一些东西到控制台,但无法让它工作。我在教程“向视图添加按钮”中的部分,大约在页面的五分之一处 其他一切都很好 我已设置RatingControl.swift文件如下: import UIKit class RatingControl: UIView { // MARK: Initialisation required init?(coder aDecoder: NS

我正在学习苹果公司提供的“开始开发iOS应用程序”教程,在这一部分我遇到了一个问题。我已经尽了一切努力让按钮打印一些东西到控制台,但无法让它工作。我在教程“向视图添加按钮”中的部分,大约在页面的五分之一处

其他一切都很好

我已设置RatingControl.swift文件如下:

import UIKit

class RatingControl: UIView {

    // MARK: Initialisation
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Create a square button
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))

        // Set the background colour of the button
        button.backgroundColor = UIColor.darkGray

        button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)), for: .touchDown)

        // Add the button to the view
        addSubview(button)
    }

    // MARK: Button Action
    func ratingButtonTapped(_: UIButton) {
        print("Button pressed")
    }
}
有几件事与本教程略有不同,但这是因为Xcode说事情已经改变了。 在Main.storyboard文件中,我使用RatingControl类添加了一个视图。按钮会显示,但我单击它时什么也没有发生


任何帮助都将不胜感激。如果需要任何额外信息,请告诉我。

那么您的代码将起作用:-

   class RatingView: UIView {

    // MARK: Initialisation
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Create a square button
        let button = UIButton(frame: CGRect(x: 200, y: 100, width: 44, height: 44))

        // Set the background colour of the button
        button.backgroundColor = UIColor.darkGray

        button.addTarget(self, action: #selector(self.ratingButtonTapped(_:)), for: .touchDown)

        // Add the button to the view
        addSubview(button)
    }

    // MARK: Button Action
    func ratingButtonTapped(_: UIButton) {
        print("Button pressed")
    }
}

那么您的代码将正常工作:-

   class RatingView: UIView {

    // MARK: Initialisation
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Create a square button
        let button = UIButton(frame: CGRect(x: 200, y: 100, width: 44, height: 44))

        // Set the background colour of the button
        button.backgroundColor = UIColor.darkGray

        button.addTarget(self, action: #selector(self.ratingButtonTapped(_:)), for: .touchDown)

        // Add the button to the view
        addSubview(button)
    }

    // MARK: Button Action
    func ratingButtonTapped(_: UIButton) {
        print("Button pressed")
    }
}

在这个故事中,实际上有三个视图的层次结构:

  • 堆栈视图(原始问题中未提及)
    • 比率控制
      • 按钮
堆栈视图是一个复杂的控件,它的工作涉及到很多巫术以及它排列的子视图的约束,它正在将RatingControl的大小减少到零。因此,该按钮超出了RatingControl的边界(通过为RatingControl提供背景色很容易证明——背景色不会出现)。RatingControl不会剪裁到其边界,因此按钮仍然可见-但是,在其superview之外,它不可点击

至于为什么堆栈视图将RatingControl的大小减少到零:这是因为RatingControl没有
intrisicContentSize
。我们需要它的原因很复杂,并且与堆栈视图如何操作其排列的子视图以及如何为它们提供约束有关。但本质上,它根据排列视图的
intrinsicContentSize
做出许多决策

你在评论中说:

在尺寸检查器中,其内部尺寸设置为占位符,宽度240,高度44。或者我需要做些什么来阻止堆栈视图变为零大小


这里要理解的关键是,尺寸检查器中的设置只是一个占位符。这仅仅是为了让故事板闭嘴,这样它就不会抱怨了。它实际上并没有在运行时为视图提供任何内在大小。要做到这一点,您必须在代码中实际重写,作为返回实际大小的计算变量。

在这个故事中,实际上有三个视图的层次结构:

  • 堆栈视图(原始问题中未提及)
    • 比率控制
      • 按钮
堆栈视图是一个复杂的控件,它的工作涉及到很多巫术以及它排列的子视图的约束,它正在将RatingControl的大小减少到零。因此,该按钮超出了RatingControl的边界(通过为RatingControl提供背景色很容易证明——背景色不会出现)。RatingControl不会剪裁到其边界,因此按钮仍然可见-但是,在其superview之外,它不可点击

至于为什么堆栈视图将RatingControl的大小减少到零:这是因为RatingControl没有
intrisicContentSize
。我们需要它的原因很复杂,并且与堆栈视图如何操作其排列的子视图以及如何为它们提供约束有关。但本质上,它根据排列视图的
intrinsicContentSize
做出许多决策

你在评论中说:

在尺寸检查器中,其内部尺寸设置为占位符,宽度240,高度44。或者我需要做些什么来阻止堆栈视图变为零大小


这里要理解的关键是,尺寸检查器中的设置只是一个占位符。这仅仅是为了让故事板闭嘴,这样它就不会抱怨了。它实际上并没有在运行时为视图提供任何内在大小。要做到这一点,您必须在代码中实际重写,作为返回实际大小的计算变量。

看起来您在“开始开发iOS应用程序(Swift)”教程中遇到了障碍,然后才为iOS 10和Swift 3进行了更新。你走了这么远真是太棒了!无论如何,@matt在下面有一个很好的技术解释,但没有包括使教程正常工作的实际代码:

将以下内容添加到类定义中(在init函数之外):


在iOS 10和Swift 3更新之前,您似乎正在跌跌撞撞地阅读“开始开发iOS应用程序(Swift)”教程。你走了这么远真是太棒了!无论如何,@matt在下面有一个很好的技术解释,但没有包括使教程正常工作的实际代码:

将以下内容添加到类定义中(在init函数之外):


为故事板中使用RatingControl类的视图提供背景色,以便查看按钮是否完全位于视图内部。它必须是,否则它在被点击时不会响应。此外,出于同样的原因,请确保为分级控制启用了“检查用户交互”。-另外,您确定要使用
。着陆
?通常的做法是
.toucupinside
。我已经告诉过你了。你知道你怎么看不到视图(“它没有改变视图的背景颜色”)?这是因为在stack视图中导致rating control视图变为零大小。所以这个按钮,一个零大小视图的子视图,变得不可用了。在你最初的问题中没有关于堆栈视图的内容。现在,您提出了一个全新的问题,关于在堆栈视图中放置自定义视图时的行为。这是个好问题,但不是你问的问题。我相信我已经完全解释了这些现象。添加背景色证明我是对的:你的按钮