【问题标题】:@obj protocol delegate method not working in second class. Swift@obj 协议委托方法在第二类中不起作用。迅速
【发布时间】:2015-07-06 23:07:38
【问题描述】:

我试图在另一个类中调用协议委托。第一个类(ViewController)有效,但我实现的第二个类没有显示任何数据。我用自动填充选项添加了它,所以它不会出错。它只是没有做任何事情。

发送者类

@objc protocol BWWalkthroughViewControllerDelegate{

  @objc optional func walkthroughPageDidChange(pageNumber:Int)     // Called when current page changes

}

@objc class BWWalkthroughViewController: UIViewController, UIScrollViewDelegate, ViewControllerDelegate {

  // MARK: - Public properties -

  weak var delegate:BWWalkthroughViewControllerDelegate?


  var currentPage:Int{    // The index of the current page (readonly)
    get{
      let page = Int((scrollview.contentOffset.x / view.bounds.size.width))
      return page
    }
  }


  // MARK: - Private properties -

  let scrollview:UIScrollView!
  var controllers:[UIViewController]!
  var lastViewConstraint:NSArray?
  var shouldCancelTimer = false
  var aSound: AVAudioPlayer!
  var isForSound: AVAudioPlayer!
  var alligatorSound: AVAudioPlayer!
  var audioPlayer = AVAudioPlayer?()
  var error : NSError?
  var soundTrack2 = AVAudioPlayer?()
  let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
  var audioPlayerAnimalSound = AVAudioPlayer?()
  var audioPlayerAlphabetSound = AVAudioPlayer?()
  var audioPlayerFullPhraze = AVAudioPlayer?()
  var audioPlayerPhonics = AVAudioPlayer?()

为节省空间而删除的代码继续进行:

  /**
  Update the UI to reflect the current walkthrough situation
  **/

  private func updateUI(){

    // Get the current page

    pageControl?.currentPage = currentPage


    // Notify delegate about the new page

    delegate?.walkthroughPageDidChange?(currentPage)

  } 

接收器类

class BWWalkthroughPageViewController: UIViewController, BWWalkthroughPage, ViewControllerDelegate, BWWalkthroughViewControllerDelegate {

第二类的功能。

func walkthroughPageDidChange(pageNumber: Int) {
    println("current page 2 \(pageNumber)")

  }

walkthroughPageDidChange 确实在 viewController 类中工作。请你帮我看看有什么问题吗?

【问题讨论】:

    标签: ios swift delegates protocols


    【解决方案1】:

    您的weak var delegate:BWWalkthroughViewControllerDelegate? 是一个可选变量,它没有在您提供的代码中的任何地方分配,因此它将为零。你必须在某个地方实例化它才能工作。

    这样做的好方法是:

    class BWWalkthroughViewController {
        let bwWalkthroughPageViewController = BWWalkthroughPageViewController()
        var bwWalkthroughViewControllerDelegate : BWWalkthroughViewControllerDelegate!
    
        init() {
            bwWalkthroughViewControllerDelegate = bwWalkthroughPageViewController as BWWalkthroughViewControllerDelegate
        }
    }
    

    需要注意的是,使用有意义的名称命名代表通常是一种好习惯。关键字“delegate”经常用于许多类并且受到限制。一个更详细的名称将消除覆盖原始代表的机会,并且如果您有多个代表,将有助于识别每个代表。

    【讨论】:

    • 谢谢,我试过了,它给出了错误 'BWWalkthroughViewControllerDelegate' 无法构造,因为它没有可访问的初始化程序
    • 对不起,我得到这个错误:'BWWalkthroughViewController.Type' 没有名为'bwWalkthroughPageViewController'的成员
    • 对,必须先声明为类的属性,然后才能赋值。我再次查看了代码。还有其他方法可以做到这一点,但基本上,将属性创建为变量,然后在一个方法中为它分配引用。
    • 我在当前的初始化中已经做到了(没有错误看起来不错),但我仍然没有在其他 VC 中获得数据。我完全被难住了。
    • 感谢您的努力,但我仍然无法正常工作。
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多