问题描述
我想为打开的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”) 任何人都可以帮助
谢谢
解决方法
- 您不是在调用超类的init(coder :)方法
- 此外,如果有,则需要删除语句
fatalError("init(coder:) has not been implemented"
因此,将您的init函数替换为以下编码器方法:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}