UIView中的协议无法在viewController中更改对象?

时间:2015-09-11 06:03:24

标签: ios swift delegates swift-protocols

我想在drawRect UIView中放置一个横幅,但它会在第一行' bannerView.rootViewController = self'中发出警告。所以我把横幅放在它的viewController中。我希望drawRect中的值改变横幅的位置。该值可以打印出来,但横幅拒绝移动。这是代码:

的ViewController:

class ViewController: UIViewController, GADBannerViewDelegate,ChangeBannerDelegate 

    // var bannerView:GADBannerView!  // shows nil when run func changeBanner(), has to use the following
    var  bannerView = GADBannerView(adSize: kGADAdSizeBanner) 

    override func viewDidLoad() {
        super.viewDidLoad()

        waveView = WaveWater(frame: self.view.bounds)
        bannerView = GADBannerView(adSize: kGADAdSizeBanner)
        bannerView.frame = CGRect(x: 0, y: self.view.bounds.height-50, width: self.view.bounds.width, height: 50)
        bannerView.adUnitID = "xxxxxxxxxxxx"
        bannerView.rootViewController = self
        bannerView.delegate = self

        self.view.addSubview(bannerView)
        bannerView.loadRequest(GADRequest())

        // set other things...
    }

    func changeBanner(y:CGFloat){

        bannerView.frame.origin.y = y
        println(bannerView.frame.origin.y) // can print 'y', and banner.frame.origin.y was changed, but banner stays where it is

    }

的UIView:

protocol ChangeBannerDelegate:NSObjectProtocol,GADBannerViewDelegate{

    func changeBanner(y:CGFloat)

}

class WaveWater: UIView, UIGestureRecognizerDelegate {

    var bannerDelegate:ChangeBannerDelegate?
    override init(frame: CGRect) {

        super.init(frame: frame)

        self.bannerDelegate = ViewController()
        changeBanner(50) // place it here just for a try
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawRect(rect: CGRect) {
        //drawing things........
    }
}

1 个答案:

答案 0 :(得分:1)

您在bannerDelegate方法中将WaveWater ViewController视图设置为init(frame:)的新实例:

self.bannerDelegate = ViewController()

应将其设置为您已有的视图控制器的实例,最好的位置就是在viewDidLoad中创建视图之后:

override func viewDidLoad() {
    super.viewDidLoad()

    waveView = WaveWater(frame: self.view.bounds)
    waveView.bannerDelegate = self

    ...
}