必需的公共init?编码器aDecoder:NSCoder{fatalError“ initcoder :)尚未实现”}

问题描述

我想为打开的edx ios应用创建自定义标签栏,但是出现此错误

有人可以告诉我如何解决此问题以及如何添加其他标签栏]

这是完整的代码

import UIKit
import WebKit

public class CourseHandoutsViewController: OfflinesupportViewController,LoadStateViewReloadSupport,InterfaceOrientationOverriding {

public typealias Environment = DataManagerProvider & NetworkManagerProvider & ReachabilityProvider & OEXAnalyticsProvider

let courseID : String
let environment : Environment
let webView : WKWebView
let loadController : LoadStateViewController
let handouts : BackedStream<String> = BackedStream()

init(environment : Environment,courseID : String) {
    self.environment = environment
    self.courseID = courseID
    self.webView = WKWebView()
    self.loadController = LoadStateViewController()
    
    super.init(env: environment)
   
    
    addListener()
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override public func viewDidLoad() {
    super.viewDidLoad()
    
    loadController.setupInController(controller: self,contentView: webView)
    addSubviews()
    setConstraints()
    setStyles()
    webView.navigationDelegate = self
}

public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    environment.analytics.trackScreen(withName: OEXAnalyticsScreenHandouts,courseID: courseID,value: nil)
    loadHandouts()
}

override func reloadViewData() {
    loadHandouts()
}

override public var shouldAutorotate: Bool {
    return true
}

override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .allButUpsideDown
}

private func addSubviews() {
    view.addSubview(webView)
}

private func setConstraints() {
    webView.snp.makeConstraints { make in
        make.edges.equalTo(saFeedges)
    }
}

private func setStyles() {
    self.navigationItem.title = Strings.courseHandouts
}

private func streamForCourse(course : OEXCourse) -> OEXStream<String>? {
    if let access = course.courseware_access,!access.has_access {
        return OEXStream<String>(error: OEXCoursewareAccessError(coursewareAccess: access,displayInfo: course.start_display_info))
    }
    else {
        let request = CourseInfoAPI.getHandoutsForCourseWithID(courseID: courseID,overrideURL: course.course_handouts)
        let loader = self.environment.networkManager.streamForRequest(request,persistResponse: true)
        return loader
    }
}

private func loadHandouts() {
    if !handouts.active {
        loadController.state = .Initial
        let courseStream = self.environment.dataManager.enrollmentManager.streamForCourseWithID(courseID: courseID)
        let handoutStream = courseStream.transform {[weak self] enrollment in
            return self?.streamForCourse(course: enrollment.course) ?? OEXStream<String>(error : NSError.oex_courseContentLoadError())
        }
        self.handouts.backWithStream((courseStream.value != nil) ? handoutStream : OEXStream<String>(error : NSError.oex_courseContentLoadError()))    
    }
}

private func addListener() {
    handouts.listen(self,success: { [weak self] courseHandouts in
        if let
            displayHTML = OEXStyles.shared().styleHTMLContent(courseHandouts,stylesheet: "handouts-announcements"),let apiHostUrl = OEXConfig.shared().apiHostURL()
        {
            self?.webView.loadHTMLString(displayHTML,baseURL: apiHostUrl)
            self?.loadController.state = .Loaded
        }
        else {
            self?.loadController.state = LoadState.Failed()
        }
        
        },failure: {[weak self] error in
            self?.loadController.state = LoadState.Failed(error: error)
    } )
}

override public func updateViewConstraints() {
    loadController.insets = UIEdgeInsets(top: self.topLayoutGuide.length,left: 0,bottom: self.bottomLayoutGuide.length,right: 0)
    super.updateViewConstraints()
}

//MARK:- LoadStateViewReloadSupport method
func loadStateViewReload() {
    loadHandouts()
}
}

extension CourseHandoutsViewController: WKNavigationDelegate {
public func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    switch navigationAction.navigationType {
    case .linkActivated,.formSubmitted,.formResubmitted:
        if let URL = navigationAction.request.url,UIApplication.shared.canopenURL(URL){
            UIApplication.shared.openURL(URL)
        }
        decisionHandler(.cancel)
    default:
        decisionHandler(.allow)
    }

}

}

何时更改所需的公共init?(编码器aDecoder:NSCoder){fatalError(“ init(coder :)尚未实现”)}

super.init(coder:aDecoder)

我收到此错误 (未在super.init调用中初始化属性“ self.courseID”) 任何人都可以帮助

谢谢

解决方法

  1. 您不是在调用超类的init(coder :)方法
  2. 此外,如果有,则需要删除语句fatalError("init(coder:) has not been implemented"

因此,将您的init函数替换为以下编码器方法:

required init?(coder aDecoder: NSCoder) {
   super.init(coder: aDecoder)
}