【问题标题】:required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } [closed]需要公共初始化?(编码器aDecoder:NSCoder){fatalError(“init(coder :)尚未实现”)} [关闭]
【发布时间】:2020-10-12 17:51:49
【问题描述】:

我想为我打开的 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)
    }

}

}

当我更改所需的公共初始化时?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } 到

super.init(coder: aDecoder)

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

谢谢

【问题讨论】:

    标签: swift openedx


    【解决方案1】:
    1. 你没有调用超类的 init(coder:) 方法
    2. 另外,如果它在那里,你需要删除声明fatalError("init(coder:) has not been implemented"

    所以,用以下编码器方法替换您的 init 函数:

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

    【讨论】:

    • 感谢您的回复,但这不起作用(属性 'self.courseID' 未在 super.init 调用时初始化) //// 这是我的代码-> 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) }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2014-07-25
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多