Панель навигации, хранящая свойство контроллера всплывающих окон - PullRequest
3 голосов
/ 20 января 2020
 setNavigationBarWithBack(success: {

        self.createGroup()

        }
 }, name: "CREATE GROUP", rightSideImage: "nextIcon")

Это мой внутренний номер для создания панели навигации с кнопкой возврата и правой кнопкой, если это необходимо. Если мне нужна правая кнопка, я могу дать имя изображению, и кнопка будет создана.

код:

func setNavigationBarWithBack(success: @escaping (()->()), name:String, imageName:String = "backIcon", rightSideImage:String) {

        let leftBtnContainerView = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        let leftBtn = UIButton(frame: leftBtnContainerView.frame)
        let leftImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 9, height: 16))
        leftImageView.image = UIImage(named:imageName)
        leftImageView.center = leftBtnContainerView.center
        leftImageView.imageDirection = 1
        leftBtnContainerView.addSubview(leftImageView)
        leftBtnContainerView.addSubview(leftBtn)

        if rightSideImage.count > 0 {
        let rightSideView = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        let rightSideBtn = UIButton(frame: rightSideView.frame)
        let rightSideimageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        rightSideimageView.image = UIImage(named:rightSideImage)
        rightSideimageView.center = leftBtnContainerView.center
        rightSideimageView.imageDirection = 1
        rightSideView.addSubview(rightSideimageView)
        rightSideView.addSubview(rightSideBtn)

        rightSideBtn.actionHandle(controlEvents: UIControl.Event.touchUpInside,
        ForAction:{() -> Void in
            success()
        })

        let rightSideBarBtnControl = UIBarButtonItem(customView: rightSideView)
        self.navigationItem.rightBarButtonItems = [rightSideBarBtnControl]
        }

        leftBtn.addTarget(self, action: #selector(returnBack), for: UIControl.Event.touchUpInside)
        let back = UIBarButtonItem(customView: leftBtnContainerView)
        self.navigationItem.leftBarButtonItems = [back]
        self.navigationItem.title = name
        self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white, NSAttributedString.Key.font:UIFont(name:"Poppins-Medium", size: 15)!]
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)

    }
}

extension UIButton {
    private func actionHandleBlock(action:(() -> Void)? = nil) {
        struct __ {
            static var action :(() -> Void)?
        }
        if action != nil {
            __.action = action
        } else {
            __.action?()
        }
    }

    @objc private func triggerActionHandleBlock() {
        self.actionHandleBlock()
    }

    func actionHandle(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
        self.actionHandleBlock(action: action)
        self.addTarget(self, action: Selector(("triggerActionHandleBlock")), for: control)
    }
}

Проблема в том, что при использовании этого кода, когда я go вернуться к предыдущему контроллеру вида, и этот контроллер вида имеет правую кнопку и действие. и когда я нажимаю на него, выполняется действие последней кнопки правой кнопки контроллера представления (V C, с которого я только что вернулся), даже если я не нахожусь в этом контроллере представления, этот блок завершения вызывает его.

И один Еще одна вещь, на которую следует обратить внимание, это то, что Сэм использует общий контроллер представления для каждого контроллера представления, чтобы написать какой-то общий код, который применим.

Кто-нибудь знает, как это исправить?

...