【问题标题】:Delegate unable to call in 2nd view controller代表无法调用第二个视图控制器
【发布时间】:2017-12-10 03:41:48
【问题描述】:

我想通过单击第一个视图控制器中的按钮将图像传递给第二个控制器。我无法理解,即使我已经将我的 1 个视图控制器的引用提供给我的第二个控制器,那么委托也没有被调用

1.这是我的第一个视图控制器的代码

protocol ViewControllerDelegate: class{
func Imagine(get: UIImage?)
}
class ViewController: UIViewController  {
let button = UIButton()
weak var delegate:ViewControllerDelegate?
var image = UIImage(named:"face1.png")
override func viewDidLoad() {
    super.viewDidLoad()
    addButton()
    addConstraints()

    // Do any additional setup after loading the view, typically from a nib.
}


func addButton() -> Void {
     button.setImage(UIImage(named:"face1.png"), for: .normal)
     button.layer.borderColor = UIColor.white.cgColor
     button.clipsToBounds = true
     button.showsTouchWhenHighlighted = true
     button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
     view.addSubview(button)
}
func buttonPressed() -> Void {
    pressed()
    let alert = UIAlertController(title: "Alert", message: "Image ???? sent to Tab 3", preferredStyle: UIAlertControllerStyle.alert)
    let ok = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
    alert.addAction(ok)
    self.present(alert, animated: true, completion:nil)

}

func addConstraints() -> Void {
    button.snp.makeConstraints { (make) in
        make.width.height.equalTo(150)
        make.center.equalToSuperview()
       }

}

func pressed(){
    delegate?.Imagine(get: UIImage(named:"face1.png"))
}


}

2.这是第二个视图控制器的代码

class ViewController3: UIViewController, ViewControllerDelegate{
var imageView=UIImageView()
var obj:ViewController?
override func viewDidLoad() {
    super.viewDidLoad()
     view.backgroundColor = UIColor.white
    // getImage = UIImage(named: "face3.png")
     addView()
     addConstraints()
    **obj.delegate = self**
}


func addView() -> Void{

    view.addSubview(imageView)
}


func addConstraints() -> Void {
    imageView.snp.makeConstraints { (make) in
        make.width.height.equalTo(150)
        make.center.equalToSuperview()
                                  }
    }
//NOT Called
    func Imagine(get: UIImage?) {
    imageView.image = get
}
}

3.这是我的标签栏控制器

class ViewController4: UITabBarController ,UITabBarControllerDelegate {
var v:ViewController?
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = UIColor.white
    self.delegate = self
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    let tab1 = ViewController()
    let tab1BarItem = UITabBarItem(title: "Tab1", image:UIImage(named:"bell-off-7.png"), selectedImage:UIImage(named:"bell-7.png") )
    tab1.tabBarItem = tab1BarItem


    let tab2 = ViewController2()
    let tab2BarItem = UITabBarItem(title: "Tab2", image: UIImage(named:"bell-off-7.png"), selectedImage: UIImage(named:"bell-7.png"))
    tab2.tabBarItem = tab2BarItem


    let tab3 = ViewController3()

    let tab3BarItem = UITabBarItem(title: "Tab3", image:     UIImage(named:"bell-off-7.png"), selectedImage: UIImage(named:"bell-7.png"))
    tab3.tabBarItem = tab3BarItem
    self.viewControllers = [tab1,tab2,tab3]
}

}

【问题讨论】:

    标签: ios swift uiviewcontroller delegation swift-protocols


    【解决方案1】:

    您必须在切换标签时设置图像。 目前,您正在做的是更改尚未显示的 viewController 的图像。

    您可以为每个项目添加标签并使用didSelectViewController委托功能

    在 tabBar ViewController 中添加一个变量 tappedImage 像

    var tappedImage:UIImage?
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
    
        let tab1 = ViewController()
        let tab1BarItem = UITabBarItem(title: "Tab1", image:UIImage(named:"bell-off-7.png"), selectedImage:UIImage(named:"bell-7.png") )
        tab1BarItem.tag = 0
        tab1.tabBarItem = tab1BarItem
    
    
        let tab2 = ViewController2()
        let tab2BarItem = UITabBarItem(title: "Tab2", image: UIImage(named:"bell-off-7.png"), selectedImage: UIImage(named:"bell-7.png"))
        tab2BarItem.tag = 1
        tab2.tabBarItem = tab2BarItem
    
    
        let tab3 = ViewController3()
    
        let tab3BarItem = UITabBarItem(title: "Tab3", image:     UIImage(named:"bell-off-7.png"), selectedImage: UIImage(named:"bell-7.png"))
        tab3BarItem.tag = 2
        tab3.tabBarItem = tab3BarItem
        self.viewControllers = [tab1,tab2,tab3]
    }
    
        func Imagine(get: UIImage?) {
            tappedImage = get
        }
    
            func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
                if let secondVC = viewController as? ViewController2 {
                  secondVC.selectedImage = tappedImage
               }
            }
    

    在 ViewController2 的 viewWillAppear 中将 tappedImage 设置为 imageView 的图像

    【讨论】:

    • 这就是我想问的,在切换之间我怎么能做到这一点
    • 委托方法不会被调用,除非你在你正在使用的视图控制器中设置它的委托
    • 但是先生,我已经在我的第二个视图控制器中设置了委托
    • 在 ViewController4 中设置委托,因为我在 ViewController4 中添加了委托功能想象一下
    • 我试过你问的,但现在在我的标签栏控制器中,函数想象没有被调用,因为 tappedImage 返回 nil
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多