Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
Ios 在UIViewController上执行UIView上的动态创建UIButton AddTarget_Ios_Swift_Uiview_Uiviewcontroller_Uiview Hierarchy - Fatal编程技术网

Ios 在UIViewController上执行UIView上的动态创建UIButton AddTarget

Ios 在UIViewController上执行UIView上的动态创建UIButton AddTarget,ios,swift,uiview,uiviewcontroller,uiview-hierarchy,Ios,Swift,Uiview,Uiviewcontroller,Uiview Hierarchy,当前,这段代码执行标记样式的列表,当我想尝试将addTarget操作选项单击传递给我的UIViewController时,问题仍然存在 DrawerView.swift let menuOptions = ["Info", "Actions", "Users", "Patiens"] menuOptions.forEach({ let button = UIButton() button.setTitle($0, for: .

当前,这段代码执行标记样式的列表,当我想尝试将addTarget操作选项单击传递给我的UIViewController时,问题仍然存在

DrawerView.swift


let menuOptions = ["Info", "Actions", "Users", "Patiens"]

        menuOptions.forEach({

            let button = UIButton()
            button.setTitle($0, for: .normal)

            if $0.contains(menuOptions[0]) {
                button.style(with: .filled)
            } else {
                button.style(with: .outlined)
                button.addTarget(self, action: #selector(optionClicked(_:)), for: .touchUpInside)
            }
            actionStackView.addArrangedSubview(button)
        })

class DrawerController: UIViewController {

    var shareView = DrawerView()
    var viewModel: CarDetailViewModel?

    override func loadView() {
        shareView.viewModel = viewModel
        view = shareView
    }

    @objc func optionClicked(_ sender: UIButton) {

        let feedbackGenerator = UISelectionFeedbackGenerator()
        feedbackGenerator.selectionChanged()

        let optionClicked: String = sender.titleLabel?.text ?? "0"

        switch optionClicked {
        case "Actions": present(DrawerActionController(), animated: true, completion: nil)
        case "Notifications":
            let viewController = DrawerNotificationController()
            viewController.carDetailViewModel = viewModel
           present(viewController, animated: true, completion: nil)

        case "Patients":
            let viewUserController = DrawerUserController()
            viewUserController.carPath = "9000"
           present(viewUserController, animated: true, completion: nil)
        default: break
        }
    }
}

DrawerController.swift


let menuOptions = ["Info", "Actions", "Users", "Patiens"]

        menuOptions.forEach({

            let button = UIButton()
            button.setTitle($0, for: .normal)

            if $0.contains(menuOptions[0]) {
                button.style(with: .filled)
            } else {
                button.style(with: .outlined)
                button.addTarget(self, action: #selector(optionClicked(_:)), for: .touchUpInside)
            }
            actionStackView.addArrangedSubview(button)
        })

class DrawerController: UIViewController {

    var shareView = DrawerView()
    var viewModel: CarDetailViewModel?

    override func loadView() {
        shareView.viewModel = viewModel
        view = shareView
    }

    @objc func optionClicked(_ sender: UIButton) {

        let feedbackGenerator = UISelectionFeedbackGenerator()
        feedbackGenerator.selectionChanged()

        let optionClicked: String = sender.titleLabel?.text ?? "0"

        switch optionClicked {
        case "Actions": present(DrawerActionController(), animated: true, completion: nil)
        case "Notifications":
            let viewController = DrawerNotificationController()
            viewController.carDetailViewModel = viewModel
           present(viewController, animated: true, completion: nil)

        case "Patients":
            let viewUserController = DrawerUserController()
            viewUserController.carPath = "9000"
           present(viewUserController, animated: true, completion: nil)
        default: break
        }
    }
}


尝试了按钮.addTarget(self,action:#selector(optionClicked(:)),for:.touchUpInside),但没有成功。

在方法
按钮中。addTarget(self,action:#selector(optionClicked(:)),for:.touchUpInside)
您需要提供指向将接收操作的viewController的指针

在您的情况下,最简单的方法是在init上使用DrawerController创建惰性变量DrawerView,并在按钮操作中使用drawer控制器

斯威夫特

class DrawerView: UIView {

    private unowned let drawerController: DrawerController

    init(drawerController: DrawerController) {
        self.drawerController = drawerController
    }

    ... wherever is your code placed ...

    let menuOptions = ["Info", "Actions", "Users", "Patiens"]

    menuOptions.forEach({

        let button = UIButton()
        button.setTitle($0, for: .normal)

        if $0.contains(menuOptions[0]) {
            button.style(with: .filled)
        } else {
            button.style(with: .outlined)
            button.addTarget(drawerController, action: #selector(DrawerController.optionClicked(_:)), for: .touchUpInside)
            actionStackView.addArrangedSubview(button)
        }
    })

    ....
}
使用
无主
来防止保留周期和内存泄漏非常重要

要创建抽屉视图,可以使用惰性变量:

lazy var shareView: DrawerView = DrawerView(drawerController: self)
lazy将允许您使用self,您也可以使用optional,稍后创建变量,但lazy基本上就是这么做的


希望有帮助

在方法
按钮中。addTarget(self,action:#selector(optionClicked(:)),for:.touchUpInside)
您需要提供指向将接收操作的viewController的指针

在您的情况下,最简单的方法是在init上使用DrawerController创建惰性变量DrawerView,并在按钮操作中使用drawer控制器

斯威夫特

class DrawerView: UIView {

    private unowned let drawerController: DrawerController

    init(drawerController: DrawerController) {
        self.drawerController = drawerController
    }

    ... wherever is your code placed ...

    let menuOptions = ["Info", "Actions", "Users", "Patiens"]

    menuOptions.forEach({

        let button = UIButton()
        button.setTitle($0, for: .normal)

        if $0.contains(menuOptions[0]) {
            button.style(with: .filled)
        } else {
            button.style(with: .outlined)
            button.addTarget(drawerController, action: #selector(DrawerController.optionClicked(_:)), for: .touchUpInside)
            actionStackView.addArrangedSubview(button)
        }
    })

    ....
}
使用
无主
来防止保留周期和内存泄漏非常重要

要创建抽屉视图,可以使用惰性变量:

lazy var shareView: DrawerView = DrawerView(drawerController: self)
lazy将允许您使用self,您也可以使用optional,稍后创建变量,但lazy基本上就是这么做的


希望有帮助

检查界面生成器。可能是您将按钮与视图控制器连接,然后从视图控制器中删除了代码,但没有连接。@AlexanderVolkov我没有使用情节提要。这都是代码。看起来目标就是视图?您需要将操作的目标设置为视图控制器,或者设置路径,以便视图可以将操作传递给视图控制器(例如,通过委派)。@3ddpaz然后检查代码的位置。看起来
self
以视图控制器为目标。将其更改为您的视图,您有
选项单击
方法。@AlexanderVolkov将self作为委托从uiviewcontroller添加到uiview,并将其添加到self on addTarget。未发生任何情况。请检查接口生成器。可能是您将按钮与视图控制器连接,然后从视图控制器中删除了代码,但没有连接。@AlexanderVolkov我没有使用情节提要。这都是代码。看起来目标就是视图?您需要将操作的目标设置为视图控制器,或者设置路径,以便视图可以将操作传递给视图控制器(例如,通过委派)。@3ddpaz然后检查代码的位置。看起来
self
以视图控制器为目标。将其更改为您的视图,您已经单击了
选项
方法。@AlexanderVolkov将self从uiviewcontroller作为委托添加到uiview,并将其添加到addTarget上的self没有发生任何问题。尝试实现您的解决方案,但我得到了这个结果。“DrawerController”类型的值没有成员“optionClicked”@3ddpaz我刚刚实现了它,它对我来说运行良好。您是否可以尝试清理项目
Product>clean build文件夹
并在没有帮助的情况下重新启动Xcode?我看不出代码本身有任何问题,您是否使用了任何访问修饰符,如
private
fileprivate
?尝试实现您的解决方案,但我得到了这个结果。“DrawerController”类型的值没有成员“optionClicked”@3ddpaz我刚刚实现了它,它对我来说运行良好。您是否可以尝试清理项目
Product>clean build文件夹
并在没有帮助的情况下重新启动Xcode?我看不出代码本身有任何问题,您是否使用了任何访问修饰符,如
private
fileprivate