【问题标题】:Navigate to viewController when programmatically created button click in swift以编程方式快速单击按钮时导航到 viewController
【发布时间】:2023-03-06 11:49:02
【问题描述】:

我正在使用 swift 创建一个框架模块。点击按钮时需要弹出警报或 ViewController。 按钮以编程方式创建。当前按钮正在显示,但操作不起作用。下面是代码。
在框架类中

public class CreateAdminMenu {

    let alertVC = AlertView()

    public init() {

    }

    public func createMenuItem(itemTitle: String) -> UIButton{
        let menuItem = UIButton(type: .system)
        menuItem.frame = CGRect(x: 30, y: 30, width: 150, height: 100)
        menuItem.backgroundColor = .blue
        menuItem.setTitle(itemTitle, for: .normal)
        menuItem.addTarget(self, action: #selector(menuItem_touchUpInside(sender:)), for: UIControl.Event.touchDown)
        return menuItem
    }

    @IBAction func menuItem_touchUpInside(sender: UIButton) {
        print("Menu Item tapped")
        alertVC.showAlert()
    }
}

class AlertView: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //self.showAlert()
    }

    func showAlert() {
        let alert = UIAlertController(title: "Test Item", message: "button tapped", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))

        self.present(alert, animated: true)
    }
}

在 App 中,ViewController

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let menu = CreateAdminMenu()
        let item = menu.createMenuItem(itemTitle: "Test Item 1")
        view.addSubview(item)
    }
}

我错过了什么?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    首先,你绝对不应该在框架中添加IBAction

    两个问题

    1. 您只需初始化AlertView 而不在ViewController 中添加/嵌入它。
    2. 您正在另一个视图中显示UIAlertController
           public class CreateAdminMenu {
    
                public init() {
    
                }
    
                public func createMenuItem(itemTitle: String) -> UIButton {
                    let menuItem = UIButton(type: .system)
                    menuItem.frame = CGRect(x: 30, y: 30, width: 150, height: 100)
                    menuItem.backgroundColor = .blue
                    menuItem.setTitle(itemTitle, for: .normal)
                    return menuItem
                }
            }
    
            class AlertView  {
                func showAlert() -> UIAlertController {
                    let alert = UIAlertController(title: "Test Item", message: "button tapped", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
                    return alert
                }
            }
    
    
            class ViewController: UIViewController {
    
                override func viewDidLoad() {
                    super.viewDidLoad()
                    // Do any additional setup after loading the view.
    
                    let menu = CreateAdminMenu()
                    let item = menu.createMenuItem(itemTitle: "Test Item 1")
                    item.addTarget(self, action: #selector(menuItem_touchUpInside(sender:)), for: UIControl.Event.touchDown)
                    view.addSubview(item)
                }
    
                @IBAction func menuItem_touchUpInside(sender: UIButton) {
                        let alert = AlertView()
                    self.present(alert.showAlert(), animated: true, completion: nil)
                }
            }
    
    

    【讨论】:

    • 除了这个答案,如果你想看看哪个按钮被点击了,你可以为每个按钮设置标签,在 menuItem_touchUpInside 方法中你可以用标签识别按钮。
    • @mahan;我试图不在 CreateAdminMenu 类中使用 UIViewController 委托,并希望在框架中显示 VC。在您的解决方案中,IBAction 移至 ViewController 类,我尝试移至框架类
    • @mahan,目标是在我提到的问题中创建一个框架(如 UIKit、Foundation ...等)。 “应用内”是指,使用创建的框架
    • @mmk 如果您将 AlertView 嵌入到 ViewController 中,您只能在 AlertView 中显示 UIAlertViewController。老实说,如果你这样做,那是一个非常糟糕的架构。
    • @mahan;嵌入 AlertView 是什么意思?我已经构建了框架项目并将其嵌入到应用程序中。之后我可以将该框架导入为“import xxxxx”
    猜你喜欢
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2020-09-23
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多