Совместное использование общего вида между различными вкладками в UITabBarController - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу создать общий вид, который будет использоваться всеми дочерними viewControllers UITabBarController.

Я пытался добиться этого с помощью контейнера, но это создает разные экземпляры для каждого дочернего viewControllers.

Спасибо!

1 Ответ

0 голосов
/ 02 сентября 2018

К сожалению, нет способа разделить представление между двумя разными суперпредставлениями или двумя разными контроллерами представления (каждый контроллер представления имеет корневое представление).

https://developer.apple.com/documentation/uikit/uiview/1622616-addsubview

Представления могут иметь только одно суперпредставление. Если представление уже имеет суперпредставление и это представление не является получателем, этот метод удаляет предыдущее суперпредставление перед тем, как сделать получателя его новым суперпредставлением.

Но вы можете симулировать то же поведение, создав общую модель данных, которая содержит соответствующие свойства для отображения идентичного представления на разных контроллерах представления.

struct ViewModel {
    let frame: CGRect
    let backgroundColor: UIColor
    // other properties that identify view state 
}

class FirstViewController: UIViewController {
    var model: ViewModel?

    @IBOutlet weak var customView: UIView! // view that you want to customize from ViewModel. You can create it programmatically.

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let viewModel = model else { return }

        customView.frame = viewModel.frame
        customView.backgroundColor = viewModel.backgroundColor
    }
}

class SecondViewController: UIViewController {
    var model: ViewModel?

    @IBOutlet weak var customView: UIView! // view that you want to customize from ViewModel. You can create it programmatically.

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let viewModel = model else { return }

        customView.frame = viewModel.frame
        customView.backgroundColor = viewModel.backgroundColor
    }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        // Hierarchy of view controllers is created by storyboard (UITabBarController contains FirstViewController & SecondViewController)
        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)

        let tabBarController = mainStoryboard.instantiateInitialViewController() as! UITabBarController

        let viewModel = ViewModel(frame: CGRect(x: 10, y: 10, width: 20, height: 20), backgroundColor: UIColor.cyan)
        (tabBarController.viewControllers[0] as! FirstViewController).model = viewModel
        (tabBarController.viewControllers[1] as! SecondViewController).model = viewModel

        window = UIWindow(frame: UIScreen.main.bounds)
        window.rootViewController = tabBarController 

        return true
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...