我试图为我的应用程序创建一个GenericListController.
我有一个ProductListController,它扩展了这个扩展UIViewController的通用控制器.我已将ProductListController连接到故事板并制作了2个插座,但我总是收到此错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x7c158ca0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchBar.'
Run Code Online (Sandbox Code Playgroud)
我收到这个错误的所有我的网点,如果我从GenericListController删除通用T它的工作原理.我猜一个故事板不能用泛型加载超级.我怎样才能使它工作?
我的代码:
class GenericListController<T> : UIViewController {
var list : [T] = [T]()
var filteredlist : [T] = [T]()
func getData(tableView : UITableView) {
.....
}
func setData(list : [T], tableView : UITableView) {
.....
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
class ProductListController : GenericListController<ProductModel> {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var …Run Code Online (Sandbox Code Playgroud) 我想简化在UITableViewCell子类中调用"setup"方法的过程.但是,并非所有设置方法都相同,但它们的参数继承自相同类型.是否可以使用泛型或协议不必每次都抛出参数?
首先,我是一个像这样的cellForRow方法:
class DataSource<V : UIViewController, T: TableViewCellData, VM: ViewModel> : NSObject, UITableViewDataSource, UITableViewDelegate {
var dataCollection: TableViewDataCollection<T>!
var viewModel: VM!
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellData = dataCollection.object(for: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: cellData.identifier(), for: indexPath)
if let setupableCell = cell as? CellDataSetupable {
setupableCell.setup(with: cellData, viewModel: viewModel)
}
return cell
}
}
protocol CellDataSetupable : class {
func setup(with cellData: TableViewCellData, viewModel: ViewModel)
}
Run Code Online (Sandbox Code Playgroud)
我使用cellData和viewModel设置单元格.
在我的(很多)自定义UITableViewCell子类中:
extension BlurbTableViewCell : CellDataSetupable {
func …Run Code Online (Sandbox Code Playgroud) 我有这个视图控制器,用于以通用方式呈现模型对象的详细信息:
class APIModelDetailsVC<T where T: APIModel>: UIViewController {...}
Run Code Online (Sandbox Code Playgroud)
我希望我的故事板能够使用这个课程.我可以在Interface Builder中分配它:
我在tableview的didSelect方法中准备了这个ViewController(包括指定通用占位符的类型):
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("didSelectRowAtIndexPath \(indexPath.row)")
if let vc = UIStoryboard(name: "APIModelDetailsVC", bundle: nil).instantiateInitialViewController() as? APIModelDetailsVC<StarWarsPerson> {
vc.model = data[indexPath.row]
self.navigationController?.pushViewController(vc, animated: true)
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试导航到此视图控制器时,出现以下控制台错误:
Unknown class _TtC14api_collection17APIModelDetailsVC in Interface Builder file.
Run Code Online (Sandbox Code Playgroud)
这是故事板的记录限制吗?有没有一种方法可以/应该指定通用,以便故事板可以链接到它?