Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何让UIViewController继承另一个UIViewController?_Swift_Inheritance_Uistoryboard_Iboutlet - Fatal编程技术网

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为零,除非您从情节提要连接它们。