【问题标题】:How to create identical objects with a button in Xcode, Swift如何在 Xcode、Swift 中使用按钮创建相同的对象
【发布时间】:2016-11-12 13:13:04
【问题描述】:

假设我想创建一个按钮列表。我有一个按钮 B,单击该按钮时,会以这种方式创建按钮 A 的列表。

然后,当每个按钮 A 被点击时,它都会自行删除。

我该怎么做? 谢谢

【问题讨论】:

  • 有很多方法可以做到这一点。到目前为止,您尝试过什么?
  • 还没有,你有什么建议?
  • 一个简单的谷歌搜索,以编程方式创建 UIButton以编程方式删除 UIButton 就可以了。不过,下次在 SO 上发布问题之前,请尝试使用所有可能的资源。
  • 是的,但是如何将每个新按钮链接到他们的方法?

标签: swift xcode class button


【解决方案1】:

要做到这一点,您需要做一些事情:

  • IBOutletNSView 的一个 NSView 会自动出现在您的 NSWindow 中。我打电话给我的mainView。 (注意:我在 Mac 上使用 Cocoa 进行了此操作,因此使用了 NSWindow,尽管我认为此过程在 iOS/Cocoa Touch 上会非常相似)
  • 两张图片,一张是 A 按钮,一张是 B 按钮,分别称为“A”和“B”。

如果我们希望 A 按钮被复制多次,我们将需要一个 A 按钮类。 A 按钮类有一个初始化程序,它以编程方式将其转换为“图像按钮”,例如。一个按钮,其表面有图像而不是文本。此外,AButton 类实现了touchesBegan:,这是一个监听按钮点击的函数。执行单击时,按钮会调用该函数。然后该按钮会从它所在的任何视图中移除自身。

class AButton: NSButton {
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)

        self.bezelStyle = .regularSquare
        self.setButtonType(.momentaryPushIn)
        self.isBordered = false
        self.image = NSImage(named: "A") // puts image on the face of the button
    }

    override func touchesBegan(with event: NSEvent) { // "when button is clicked..."
        self.removeFromSuperview() // remove from view
    }
}

接下来,我们需要在单击 B 按钮时执行一个函数。使用 Interface Builder (IB) 将“图像按钮”拖到主窗口上。在工具栏中,选择此按钮的图像为“B”。然后,将 IBAction 从 B 按钮拖到您的 AppDelegate(或控制器文件/类,无论它是什么)。此函数运行一个循环,创建许多 AButton 实例,正确定位它们,然后使用 addSubview() 将它们添加到 NSView。每当按下其中一个时,它就会从视图中移除。

@IBOutlet weak var mainView: NSView! // outlet to NSView in main window

@IBAction func bButtonPressed(_ sender: Any) {
        for i in 0...3 {
            let x = 50 + i*110
            let y = 50

            let theButton = AButton(frame: NSMakeRect(CGFloat(x), CGFloat(y), 100, 100))
            mainView.addSubview(theButton) // adds newly created AButton to the view
        }
}

【讨论】:

  • 但是,当我创建的 IBAction 被点击到每个 A 按钮时,如何链接它们以删除 A 按钮?
【解决方案2】:

有很多方法..

iOS

对于“按钮 A”,我更喜欢 UICollectionViewCell。

优势

  1. UICollectionView 具有 UIScrollView 并自动动态管理其 contentSize。
  2. UICollectionViewCell 将被重用。所以不会存在内存问题和性能问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多