     ) {
         assert(Thread.isMainThread)
 
+        self.init(
+            viewController: type(of: viewController),
+            id: id,
+            outlet: outlet,
+            state: state,
+            constants: merge(constants),
+            expressions: expressions,
+            children: children
+        )
+
+        _viewController = viewController
+        _view = viewController.view
+    }
+
+    /// Create a node for managing a view
+    public convenience init(
+        view: UIView.Type = UIView.self,
+        id: String? = nil,
+        outlet: String? = nil,
+        state: Any = (),
+        constants: [String: Any]...,
+        expressions: [String: String] = [:],
+        children: [LayoutNode] = []
+    ) {
         var expressions = expressions
         if let outlet = outlet {
             expressions["outlet"] = outlet
         }
         try! self.init(
-            class: viewController.classForCoder,
+            class: view,
             id: id,
             state: state,
             constants: merge(constants),
             expressions: expressions,
             children: children
         )
-
-        _viewController = viewController
-        _view = viewController.view
-    }
-
-    /// Create a node for managing a view instance
+    }
+
+    /// Create a node for managing a specific view instance
     public convenience init(
-        view: UIView? = nil,
+        view: UIView,
         id: String? = nil,
         outlet: String? = nil,
         state: Any = (),

        }
    }

    /// Create a node for managing a view controller instance
    public convenience init(
        viewController: UIViewController,
        id: String? = nil,

    ) {
        assert(Thread.isMainThread)

        self.init(
            view: type(of: view),
            id: id,
            outlet: outlet,
            state: state,
            constants: merge(constants),
            expressions: expressions,
