ViewController 可以是包含 IBOutlets 等的通用吗?
Can ViewController be generic which contains IBOutlets etc?
我的 viewcontroller 可以是通用的并且仍然包含 IBOutlet 吗?
class AViewController<T> : SuperViewController, Decodable where T : Decodable {
@IBOutlet weak var leftButton: UIButton!
@IBOutlet weak var rightButton: UIButton!
var pop : T?
}
这个实现会有效吗?它给我一个错误。 AViewController类型不符合decodable.Any思路?
只需删除 , Decodable
。没有理由表明视图控制器 class 本身符合 Decodable
.
您的错误已消失:
class AViewController<T> : SuperViewController where T : Decodable {
@IBOutlet weak var leftButton: UIButton!
@IBOutlet weak var rightButton: UIButton!
var pop : T?
}
这完全独立于您为什么还声明 T
必须是 Decodable
。这是一个完全不同的问题,我不打算解决。
包含 IBOutlet
的视图控制器是您将在 Interface Builder 中操作的视图控制器。您面临两个问题。
Interface Builder 视图控制器是使用所需的 init(coder:)
初始化器创建的,它无法实例化通用对象,因为它没有任何上下文可以知道 T
应该在运行时间。
当您在代码中创建 AViewController
的实例时,您将指定具体类型
let aVC = AViewController<String>()
但是你不能在 IB 的 Identity Inspector 中做这样的事情。这是不允许的:
你可以做的是创建一个故事板特定的视图控制器,它继承你的通用视图控制器,但指定具体类型
class AStringViewController: AViewController<String> {
}
并在身份检查器的 IB 中使用 AStringViewController
并根据需要连接网点。
如果您发现这不是您真正想要的,并且您的视图控制器需要更加动态,那么您将不得不在代码中创建视图控制器,并且您将无法使用插座。
另一种选择是在您的插座中使用非通用视图控制器,并使用在具有您需要的通用代码的代码中创建的子视图控制器。
我的 viewcontroller 可以是通用的并且仍然包含 IBOutlet 吗?
class AViewController<T> : SuperViewController, Decodable where T : Decodable {
@IBOutlet weak var leftButton: UIButton!
@IBOutlet weak var rightButton: UIButton!
var pop : T?
}
这个实现会有效吗?它给我一个错误。 AViewController类型不符合decodable.Any思路?
只需删除 , Decodable
。没有理由表明视图控制器 class 本身符合 Decodable
.
您的错误已消失:
class AViewController<T> : SuperViewController where T : Decodable {
@IBOutlet weak var leftButton: UIButton!
@IBOutlet weak var rightButton: UIButton!
var pop : T?
}
这完全独立于您为什么还声明 T
必须是 Decodable
。这是一个完全不同的问题,我不打算解决。
包含 IBOutlet
的视图控制器是您将在 Interface Builder 中操作的视图控制器。您面临两个问题。
Interface Builder 视图控制器是使用所需的
init(coder:)
初始化器创建的,它无法实例化通用对象,因为它没有任何上下文可以知道T
应该在运行时间。当您在代码中创建
AViewController
的实例时,您将指定具体类型
let aVC = AViewController<String>()
但是你不能在 IB 的 Identity Inspector 中做这样的事情。这是不允许的:
你可以做的是创建一个故事板特定的视图控制器,它继承你的通用视图控制器,但指定具体类型
class AStringViewController: AViewController<String> {
}
并在身份检查器的 IB 中使用 AStringViewController
并根据需要连接网点。
如果您发现这不是您真正想要的,并且您的视图控制器需要更加动态,那么您将不得不在代码中创建视图控制器,并且您将无法使用插座。
另一种选择是在您的插座中使用非通用视图控制器,并使用在具有您需要的通用代码的代码中创建的子视图控制器。