Swift 如何在没有第三方框架的情况下在ViewController中正确初始化可编码结构?
我一直在尝试使用ViewController上的故事板初始化一个Swift 如何在没有第三方框架的情况下在ViewController中正确初始化可编码结构?,swift,Swift,我一直在尝试使用ViewController上的故事板初始化一个可编码的结构,但它不起作用 你知道如何解决这个问题吗 提前谢谢 以下是我在View Controller上尝试的内容: var images: ImageRequest init(images: ImageRequest) { self.images = images } 上面的代码错误: 错误:“UIViewController”的子类必须提供必需的“初始值设定项”init(编码器:)” 上面的代码错误: 在从初始值设
可编码的
结构,但它不起作用
你知道如何解决这个问题吗
提前谢谢
以下是我在View Controller上尝试的内容:
var images: ImageRequest
init(images: ImageRequest)
{
self.images = images
}
上面的代码错误:
错误:“UIViewController”的子类必须提供必需的“初始值设定项”init(编码器:)”
上面的代码错误:
在从初始值设定项返回之前,不会在所有路径上调用“super.init”
上面的代码崩溃了。错误消息:
线程1:致命错误:尚未实现init(编码器:)
以下是我在结构上尝试的内容:
public struct ImageRequest: Codable {
public var albumId: Int
public var id: Int
public var title: String
public var url: URL
public var thumbnailUrl: URL
public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
self.albumId = 0
self.id = 0
self.title = ""
self.url = URL(string: "")!
self.thumbnailUrl = URL(string: "")!
}
}
您可能正在使用序列图像板,尝试创建此视图控制器时会调用方法
init?(编码器:
)。在init?(编码器:
中,您给出了导致错误的致命错误。您需要使用已创建的自定义初始值设定项,而不是使用序列图像板提供的init?(编码者:
初始值设定项
以下是您需要的代码要点。但是,您必须进行修改,使其能够根据您的需求工作
class ViewController: UIViewController {
var someProperty: String
init(property: String) {
someProperty = property
super.init(nibName: nil, bundle: nil)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
view = viewController.view
}
required init?(coder: NSCoder) {
someProperty = ""
super.init(coder: coder)
}
}
故事板中的视图控制器始终使用
init?(coder:)
初始化。除了iOS传递的coder
之外,您不能将任何参数传递给该初始化器
因此,您必须设计另一种方法来初始化图像
在init?(编码器:)
中初始化它
将其声明为可选,并在viewDidLoad()中对其进行初始化
如果视图控制器是通过segue访问的,则将其声明为可选的,并在源VC的prepareforsgue(u:sender:)
方法中为其赋值
您选择的方法在很大程度上取决于应用程序的体系结构以及ImageRequest
的数据来源。“上述代码崩溃。崩溃时是否有错误消息?实际上,您试图做的是如何使用自定义参数初始化故事板中的ViewController,否?请参见:是。这是错误消息:线程1:致命错误:init(编码器:)尚未实现。我需要在ViewController中使用该结构模型,它将从api接收数据。如果我尝试使用自定义初始值设定项,Xcode会抱怨,正如我在帖子中提到的:错误:“必需的“初始值设定项”init(编码者:)'必须由'UIViewController'的子类提供。我添加了一小部分代码。但是,它只是一个帮助器,可以帮助您理解它有多麻烦。最好的情况是使用实例化VC和设置所需变量的常规方法。的确,它会变得混乱。我尝试了该代码,并给了我以下错误:Property'self.somePproperty'未在super.init调用中初始化当您说实例化VC的普通方法时,您的意思是哪种方法在我的情况下可以工作?谢谢您可以通过向您的属性提供默认值来删除该错误。我已编辑代码以修复此问题,我错过了该行。我已将该方法提供给InstanceViewController在上面的解决方案中。在另一个VC中使用该方法并设置属性值。如果它是字符串,但类型是ImageRequest,则该方法有效,我将如何为ImageRequest类型的someProperty指定默认值?
public struct ImageRequest: Codable {
public var albumId: Int
public var id: Int
public var title: String
public var url: URL
public var thumbnailUrl: URL
public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
self.albumId = 0
self.id = 0
self.title = ""
self.url = URL(string: "")!
self.thumbnailUrl = URL(string: "")!
}
}
public struct ImageRequest: Codable {
public var albumId: Int
public var id: Int
public var title: String
public var url: URL
public var thumbnailUrl: URL
public init( albumId: Int, id: Int, title: String, url: URL, thumbnailUrl: URL) {
self.albumId = albumId
self.id = id
self.title = title
self.url = url
self.thumbnailUrl = thumbnailUrl
}
}
class ViewController: UIViewController {
var someProperty: String
init(property: String) {
someProperty = property
super.init(nibName: nil, bundle: nil)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
view = viewController.view
}
required init?(coder: NSCoder) {
someProperty = ""
super.init(coder: coder)
}
}