相关疑难解决方法(0)

使用故事板的swift 2.0中的通用控制器

我试图为我的应用程序创建一个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)

generics storyboard ios swift swift2

24
推荐指数
2
解决办法
6160
查看次数

使用基于协议或基类的泛型参数值将子类上的方法调用到UITableViewCell

我想简化在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)

generics ios swift

9
推荐指数
1
解决办法
1003
查看次数

使用Generic将Storyboard链接到UIViewController

我有这个视图控制器,用于以通用方式呈现模型对象的详细信息:

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)

这是故事板的记录限制吗?有没有一种方法可以/应该指定通用,以便故事板可以链接到它?

interface-builder ios

3
推荐指数
1
解决办法
2002
查看次数

标签 统计

ios ×3

generics ×2

swift ×2

interface-builder ×1

storyboard ×1

swift2 ×1