以不同的类swift编程创建一个按钮

时间:2017-01-04 09:40:34

标签: ios objective-c

我是swift的新手,并尝试以编程方式创建UIButton。我有两节课。我在一个类中创建一个按钮,并从另一个类调用该方法。

类视图控件

import UIKit

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()

    let renderobj = render()
    renderobj.sign()
}
  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
}

类呈现

import UIKit

class render: UIViewController {
  func sign() {
    let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
    button.backgroundColor = .green
    button.setTitle("Test Button", for: .normal)
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

    self.view.addSubview(button)
  }

  func buttonAction(sender: UIButton!) {
    print("Button tapped")
  }
}

但是没有创建按钮。如果我将UIButton代码放在viewDidLoad()内,则可行。我希望按钮在不同类的功能中创建。有可能这样做吗?

感谢您的帮助

4 个答案:

答案 0 :(得分:1)

完成此操作后

let renderobj = render()

调用此函数后,会初始化一个新按钮并将其添加到render视图控制器的视图中。

renderobj.sign()

renver视图控制器仅被初始化,其视图未添加到当前视图控制器ViewController

如果您想显示render控制器,请像往常一样展示它。如果要将该按钮添加到ViewController,则要声明按钮变量并访问它,或者在sign()函数中返回

答案 1 :(得分:1)

func sign() -> UIButton
{
   let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
   button.backgroundColor = .green
   button.setTitle("Test Button", for: .normal)
   button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
   return button 
}
  

返回该按钮后,您可以将其添加到主叫视图控制器视图中

override func viewDidLoad() {
super.viewDidLoad()

let renderobj = render()
let button = renderobj.sign()
self.view.addSubview(button)
}

答案 2 :(得分:1)

我认为这里对UIViewController的概念缺乏了解。 UIViewController用于管理向用户显示的视图,将其视为应用的单个屏幕。您可以在其他视图控制器中嵌入视图控制器,但通常您不需要为基本内容执行此操作。

UIViewController有一个生命周期,您可以在此处找到更多信息:https://developer.apple.com/reference/uikit/uiviewcontroller#1652793

现在您想要做的就是完成创建按钮的功能,您可以通过在ViewController类(或其他地方的其他类)中创建工厂方法来实现此目的,或者通过继承UIButton并创建一个方便的初始化方法来创建具有你想要的属性的按钮(你也可以使用Swift扩展,但我不会在这里进入)。

让我们看一下最简单的方法,并在ViewController类中创建一个工厂方法:

// The button method takes a title and a selector (the selector is the method that should be called when the button is tapped)
func makeButton(title: String, action: Selector) -> UIButton {

    // Create a basic button with a default size
    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))

    // Customise the button with your settings
    button.backgroundColor = .green
    button.setTitle(title, for: .normal)
    button.addTarget(self, action: action, for: .touchUpInside)

    // Return the newly created button
    return button
}

现在我们有一个方法可以创建一个默认大小和位置的按钮,我们想要调用该方法来创建一个按钮,然后将其添加为ViewController视图的子视图。为此,我们可以在我们覆盖的viewDidLoad()方法中执行某些操作:

override func viewDidLoad() {

    // Always remember to call the super method to ensure all super classes have a chance to do any work thats required by them
    super.viewDidLoad()

    // Create the button by calling our new method
    let button = self.makeButton(title: "Test Button", action: #selector(buttonTapped))

    // Set the origin of the button to move it to the right position
    button.frame.origin = CGPoint(x: 100, y: 100)

    // Finally add the new button as a subclass of the view controllers view
    self.view.addSubview(button)
}

现在我们了解在方法中发生的事情,我们可以将它们放在一起,形成一个如下所示的类:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        let button = self.makeButton(title: "Test Button", action: #selector(buttonTapped))
        button.frame.origin = CGPoint(x: 100, y: 100)
        self.view.addSubview(button)
    }

    func makeButton(title: String, action: Selector) -> UIButton {

        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))

        button.backgroundColor = .green
        button.setTitle(title, for: .normal)
        button.addTarget(self, action: action, for: .touchUpInside)

        return button
    }

    func buttonTapped(sender: UIButton) {

        print("Button tapped")
    }
}

答案 3 :(得分:0)

您在此处创建新的UIViewController

let renderobj = render()
renderobj.sign()

ViewController实例正在显示。