Swift 如何让UIViewController继承另一个UIViewController?
在实现以下(类继承)之后:Swift 如何让UIViewController继承另一个UIViewController?,swift,inheritance,uistoryboard,iboutlet,Swift,Inheritance,Uistoryboard,Iboutlet,在实现以下(类继承)之后: 如何让UIViewControllerA继承UIViewControllerBIBOutlets?如何将故事板上的组件连接到子类UIViewControllerA?如果您的目标是让IBOutlets被继承,您应该执行以下操作: 1-在超级类中添加IBoutlet: 超级类(UIViewController)不应该直接连接到情节提要上的任何ViewController,它应该是通用的。将IBOutlet添加到超级类时,它们不应该连接到任何组件,子类应该这样做。另外,您可
如何让
UIViewControllerA
继承UIViewControllerB
IBOutlets?如何将故事板上的组件连接到子类UIViewControllerA
?如果您的目标是让IBOutlets被继承,您应该执行以下操作:
1-在超级类中添加IBoutlet:
超级类(UIViewController)不应该直接连接到情节提要上的任何ViewController,它应该是通用的。将IBOutlet添加到超级类时,它们不应该连接到任何组件,子类应该这样做。另外,您可能希望为超级类中的IBOutlets做一些工作(这就是为什么您应该应用此机制)
超级类应类似于:
class SuperViewController: UIViewController, UITableViewDataSource {
//MARK:- IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// setting text to the label
label.text = "Hello"
// conforming to table view data source
tableView.dataSource = self
}
// handling the data source for the tableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = "Hello!"
return cell!
}
}
class ViewController: SuperViewController {
override func viewDidLoad() {
// calling the super class version
super.viewDidLoad()
}
}
2-继承超类并连接IBOutlet:
简单地说,您的子类应该类似于:
class SuperViewController: UIViewController, UITableViewDataSource {
//MARK:- IBOutlets
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// setting text to the label
label.text = "Hello"
// conforming to table view data source
tableView.dataSource = self
}
// handling the data source for the tableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = "Hello!"
return cell!
}
}
class ViewController: SuperViewController {
override func viewDidLoad() {
// calling the super class version
super.viewDidLoad()
}
}
从情节提要中,将视图控制器指定给ViewController
(子类),然后重建项目(cmd+b)
现在,在选择所需的视图控制器并选择“Connection Inspector”之后,您应该在IBOutlets部分中看到:
您可以手动将它们连接到子类ViewController中存在的UI组件(从空圆圈拖动到组件)。它们应该看起来像:
就这样!子类的表视图和标签应该继承超类中包含的内容
希望这有帮助。继承是一种编程语言功能,它与情节提要无关,到底是什么问题?当我使用self时。UIViewControllerA中的标签为nil,默认情况下所有控件都为nil如果您将它们实现为IBOutlets,则默认情况下它们应该为
nil
,除非您从情节提要连接它们。有没有更方便的方法?我确实将它们实现为IBOutlets只是为了确保我理解您试图实现的目标,你想在基类中声明IBOutlets,并让子类通过故事板与它们交互,对吗?感谢你仔细的回答。我昨天从你的回答中解决了这个问题:默认情况下,如果你将它们实现为IBOutlets,它们在默认情况下应该为零,除非你从故事板连接它们。很高兴为你提供帮助:)是的,默认情况下,IBOutlets为零,除非您从情节提要连接它们。