- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近重构了我的类 BookTableViewController
来自 UITableViewController
的简单继承, 所以它现在继承自通用类 FetchedResultsTableViewController<TResultType, TCellType>
它本身继承自 UITableViewController
.
类声明如下所示:
class BookTableViewController: FetchedResultsTableViewController<Book, BookTableViewCell> {
override func viewDidLoad() {
// breakpoints in here do not catch!
}
}
class FetchedResultsTableViewController<TResultType, TCellType: UITableViewCell>:
UITableViewController, NSFetchedResultsControllerDelegate {
// implementation here
}
在 Storyboard 中,自定义类和模块都已设置,我可以单击箭头跳转到 BookTableViewController
的代码。类,表明 Storyboard已正确链接到类。但是,当我尝试运行该应用程序时,无法识别该类 - viewDidLoad()
中的代码不运行,我在运行我的应用程序时收到以下记录的消息:
Unknown class _TtC12Reading_List23BookTableViewController in Interface Builder file.
我正在运行 XCode 7.3 (Swift 2.2)。这是 Storyboard 的限制、错误,还是我遗漏了什么?
谢谢!
更新:
经过一些实验,它似乎确实与泛型继承有关,而不是类的可访问性。定义了以下类:
import Foundation
import UIKit
// Both of these classes are accessible by the Storyboard
class FirstInheritance : UITableViewController{}
class SecondInheritance : FirstInheritance{}
// The generic class is also accessible
class GenericViewController<T> : UITableViewController{}
// But this class is not accessible...
class ConcreteViewController : GenericViewController<String>{}
除ConcreteViewController
之外的所有类在 Storyboard 的类自动完成中建议(尽管通用类也不起作用,因为无法在 Storyboard 中指定类型参数)。
最佳答案
游戏有点晚了,但这个信息可能对任何碰到这个话题的人都有用。
实际上,据我所知,从 Swift 3 开始, Storyboard中对泛型的支持有些笨拙。
我已经设法编写了一个扩展 UIViewController 的通用基类,然后约束了该通用类的几个子类并在 Storyboard中使用它们。
实际代码的布局与下面指定的布局类似:
class GenericParent: UIViewController {
// Has a few, non-generic members ...
}
class ActualGenericClass<T>: GenericParent {
// There are more generic members in the actual class
var adapter: Adapter<T> = Adapter()
}
// This class is usable in Interface Builder;
// although auto-complete won't show it, fully writing down
// the class name works
class SpecificInstanceOfActualGenericClass: ActualGenericClass<Int> {
@IBOutlet weak var tableView: UITableView!
}
令我惊讶的是,它完美地工作了!
另一方面,下一个例子似乎不起作用:
class GenericCell<T>: UITableViewCell {
var node: T? = nil
}
class SpecificCell: GenericCell<Int> {
@IBOutlet weak var coolTitleLabel: UILabel!
}
和以前一样,在 Interface Builder 上(在单元格的动态原型(prototype)上)显式写入单元格的类名会在表格 View 单元格上设置类,并且导出可见。
但是,在运行时,当实例化包含单元格动态原型(prototype)的 UIViewController 时,会显示“界面生成器文件中的未知类”警告,并且应用程序会在单元格出队时崩溃。
所以@Andew Bennet,声明:
Storyboards do not support classes which inherit from generic classes
虽然您至少是对的,但似乎不再是 100% 正确;这是我第一次成功实现这一目标,尽管只是部分实现!
有些东西有用,有些东西没用,这让我很烦恼,但总比没有好。
这在 Java 中非常简单......
关于ios - "Unknown class in interface builder file"在 Storyboard中使用从泛型类继承的类时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36344158/
我是一名优秀的程序员,十分优秀!