最近我写了一个只有一个场景的应用程序。我必须为ViewController设置自定义背景图片,由View管理(即,我的顶视图包含ViewController)。后来,我不得不在UIImageView中实现一些逻辑,以便在屏幕旋转时正确地旋转/更改图片。此外,我还必须为ViewController覆盖一些属性,如preferredStatusBarStyle
现在我必须在我的应用程序中实现更多的场景/屏幕,结果发现它们都必须具有与当前屏幕相同的设计,所以我认为如果我创建一个ViewController来包含背景图片的通用旋转相关逻辑,这样我就可以从这个CommonViewController继承所有其他ViewController的。我唯一的问题是CommonViewController“需要”它管理的视图有一个CommonViewController属性,我不知道如何确保这个属性。
如果我创建了一个新的文件backgroundPicture: UIView和XIB文件,我可以在XIB中添加CommonViewController图像视图并将其与代码连接(通过常规的“控制拖动”方法),但显然这行不通,因为不能保证继承backgroundPicture的视图将具有此属性。在Swift中没有对iOS进行黑客攻击的情况下,解决这个问题的正确方法是什么?
不幸的是我找不到解决办法,也许我一直在寻找错误的方法。似乎我需要为每个场景(对于每个CommonViewController)继承一个CommonViewController,但是我还必须以某种方式将每个控制器的俯视图设置为等于一些CustomViewController,这样当我试图访问CommonView时,CommonViewController不会崩溃。
显而易见的方法是在@IBOutlet weak var backgroundPicutre: UIImageView!中定义一些方法或属性,以便继承它的控制器可以实现/重写它,但这似乎有点老套,因为它仍然需要在继承CommonViewController的每个ViewController中粘贴副本。
我如何想象解决方案:我创建CommonViewController,然后在我的故事板中创建一个视图控制器,并将“类”属性更改为“CustomViewController”(在属性编辑器中),然后我选择与这个新添加的控制器相对应的视图,并将“Class”属性更改为“BackgroundImageViewCustomViewController: CommonViewControllerCustomViewController. But I'm not sure if it's the correct way to do (also I doubt thatIBOutletwill properly "connect" itsbakcgroundImageViewfieldUIViewwith the correspondingBackgroundImageView”,这就是为什么我想问专家们对它的看法。

最佳答案

我认为你应该在代码中定义你的基本控制器(cc),也就是说,不要为基本控制器使用无框架/故事板。这并不意味着你应该完全摆脱故事板/XIB。除了“cc>”之外,ALL其他视图控制器的接口仍然可以用XIBS/SturyBoo板实现。
在这种情况下CommonViewController实现可能如下所示:

import UIKit

class CommonViewController: UIViewController {
    // use this property every time you need to
    // manipulate backgroundPicture
    var backgroundPicture: UIImageView  = {
        // Replace with your image name
        let image = UIImage(named: "BackgroundPicture")!
        let imageView = UIImageView()
        imageView.image = image
        return imageView
    }()

    override func viewDidLoad() {
        // If subclass overrides viewDidLoad()
        // it should contain super.viewDidLoad()
        super.viewDidLoad()

        view.addSubview(backgroundPicture)

        // Align backgroundPicture to bounds of superview
        // You can remove this code and implement
        // your own alignment with frames or Autolayout
        backgroundPicture.frame = view.bounds

        // Send backgroundPicture to back of the view
        // Otherwise backgroundPicture may overlap views added in subclasses
        view.sendSubviewToBack(backgroundPicture)
    }

    override func viewDidLayoutSubviews() {
        // If subclass overrides viewDidLayoutSubviews()
        // It should contain super.viewDidLayoutSubviews()
        super.viewDidLayoutSubvews()

        // Align backgroundPicture to bounds of superview
        // You can remove this code and implement
        // your own alignment with frames or Autolayout
        backgroundPicture.frame = view.bounds
    }
}

07-28 06:28