- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 iOS/Swift 中遇到 childViewController 的多级层次结构问题。当前设置从最低到最高分为三层:
InfoViewController
SelectionViewController
主视图 Controller
InfoViewController
有一个从 XIB 加载的 View 。
SelectionViewController
包含一个带有 InfoViewController
和 UIButton
的 UIStackView
。
MainViewController
是顶级 VC,通常嵌入在 UINavigationController
中。
问题
当我添加 InfoViewController
并直接查看 MainViewController
时,一切正常。
func setupInfoViewControllerDirectlyOnMainVC () {
addChildViewController(infoViewController)
infoViewController.view.embedInside(otherView: infoContainerView)
infoViewController.didMove(toParentViewController: self)
}
但是,如果我使用相同的方法将 SelectionViewController
添加到 MainViewController
,嵌入的 InfoViewController
不会更新它的 UI - 它总是看起来像它控制的未修改的 XIB 文件。当 NOT 嵌入此 SelectionViewController
时,其行为符合预期。
如下所示,UI 是可见的,但是通过询问它的 ViewController 对其所做的任何更改都不会显示 - 它看起来与创建它的 XIB 文件完全一样。
下面是从 BasicInfoView 开始的类设置,后面是上面列出的三个 viewController。
基本信息 View
class PLBasicInfoView: PLDesignableViewFromXib {
//
// MARK: Outlets
//
//
@IBOutlet weak var photoView: PFRoundImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subtitleLabel: UILabel!
var imageFile:PFFile? {
didSet {
photoView.file = imageFile
photoView.loadInBackground()
}
}
//
// MARK: Initialization
//
//
override var nameOfXib: String {
return "PLBasicInfoView"
}
override var intrinsicContentSize: CGSize {
return CGSize(width: super.intrinsicContentSize.width, height: 56)
}
}
基本信息 View Controller
class PLBasicInfoViewController: UIViewController {
/**
The BasicInfoView which will be managed by this controller.
*/
var basicInfoView = PLBasicInfoView()
/**
This is the master stack view which contains all subviews.
*/
var stackView = UIStackView()
/**
PFFile representing the image to be displayed in the imageView. Setting a valid imageFile object automatically laods the image from the server. If set to nil, the defaultImage is displayed instead.
*/
var imageFile: PFFile? {
didSet {
if imageFile != nil {
basicInfoView.imageFile = imageFile
} else {
basicInfoView.photoView.image = defaultImage
}
}
}
/**
Default UIImage to be displayed in the imageView if there is no imageFile assigned.
*/
var defaultImage: UIImage! {
return #imageLiteral(resourceName: "ios7-camera-outline")
}
/**
Main text of the infoView
*/
var titleText:String? {
didSet {
basicInfoView.titleLabel.isHidden = (titleText == nil)
basicInfoView.titleLabel.text = titleText
}
}
/**
Secondary text of the infoView. Displays under titleText.
*/
var subtitleText:String? {
didSet {
basicInfoView.subtitleLabel.isHidden = (subtitleText == nil)
basicInfoView.subtitleLabel.text = subtitleText
}
}
/**
Embed our stackView into main view. The custom embedInsider(otherView:UIView) method (UIView extension) will take care of the subview additional as well as all layout constraints.
*/
func setupStackView () {
stackView.embedInside(otherView: view)
stackView.axis = .vertical
stackView.addArrangedSubview(basicInfoView)
}
override
func viewDidLoad() {
super.viewDidLoad()
setupStackView()
}
}
选择 View Controller
class PLSelectableInfoViewController: UIViewController {
/**
If true, the info view will be shown and the selection button will be hidden.
*/
var isAssigned = false {
didSet {
selectionButton.isHidden = isAssigned
infoView.isHidden = !isAssigned
}
}
/**
The View controller dispaying the object in question.
*/
var infoViewController: PLBasicInfoViewController! {
return PLBasicInfoViewController()
}
private
var infoView: UIView!
/**
Button on bottom of stack. Intended to allow user to assign a new value to the contact property.
*/
var selectionButton = PLButton()
/**
Stack view containing all subviews.
*/
var stackView = UIStackView()
//
// MARK: UIViewController Overrides
//
//
override
func viewDidLoad() {
super.viewDidLoad()
setupStackView()
addInfoView()
}
private
func setupStackView () {
stackView.embedInside(otherView: view)
stackView.axis = .vertical
}
private
func addInfoView () {
addChildViewController(infoViewController)
infoView = infoViewController.view
stackView.addArrangedSubview(infoView)
infoViewController.didMove(toParentViewController: self)
}
}
一些不相关的代码已被删除
注意事项
请注意,在实践中,BasicInfoViewController 和 SelectionViewController 都是子类。例如,我有一个 ContactInfoViewController,它可以传递一个 Contact 对象并显示全名、公司名称和照片(如上所述,这很好用)。还有一个 SelectionViewController 的子类来补充这个:ContactSelectionViewController。 ContactSelectionViewController 还有一个 Contact 对象属性,可以对其进行分配,然后将其传递给嵌入式 ContactInfoViewController - 这是不显示数据的位置。我在下面包含了这些子类以供其他引用。
ContactInfoViewController
同样,当直接放入 MainViewController 时,它可以完美地工作。
class PLContactInfoViewController: PLBasicInfoViewController {
/**
Contact object managed by this controller.
*/
var contact: PLContact? {
didSet {
if contact == nil {
titleText = "Not Set"
subtitleText = nil
return
}
contact?.fetchIfNeededInBackground(block: { (object, error) in
if let _ = object as? PLContact {
self.updateWithContact()
}
})
}
}
override
var defaultImage: UIImage! {
return #imageLiteral(resourceName: "ios7-contact-outline")
}
private
func updateWithContact () {
if let c = contact {
titleText = c.fullName
imageFile = c.photo
c.company?.fetchIfNeededInBackground(block: { (object, error) in
if let comp = object as? PLCompany {
self.subtitleText = comp.name
} else {
self.subtitleText = nil
}
})
}
}
}
ContactSelectionViewController
此 VC 功能正常,但嵌入的 ContactInfoViewController 不显示数据。出于某种原因,来自 ContactInfoViewController 的 View 在嵌入此 Controller 时未使用数据进行更新。
class PLContactAssignmentViewController: PLSelectableInfoViewController {
/**
The contact currently selected by this contorller
*/
var selectedContact: PLContact? {
didSet {
isAssigned = !(selectedContact == nil)
contactInfoViewController.contact = selectedContact
}
}
override
var infoViewController: PLBasicInfoViewController! {
return PLContactInfoViewController()
}
private
var contactInfoViewController: PLContactInfoViewController {
return infoViewController as! PLContactInfoViewController
}
}
最佳答案
尝试
var _infoViewController: PLBasicInfoViewController?
var infoViewController: PLBasicInfoViewController! {
if let vc = _infoViewController {
return vc
}
_infoViewController = PLBasicInfoViewController()
return _infoViewController!
}
或
lazy var infoViewController: PLBasicInfoViewController = {
return PLBasicInfoViewController()
}()
可能是因为你每次尝试访问时都在启动PLBasicInfoViewController。
关于ios - View 不显示另一个 ChildViewController 的 childViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45799307/
我在 iOS/Swift 中遇到 childViewController 的多级层次结构问题。当前设置从最低到最高分为三层: InfoViewController SelectionViewContr
我已添加一个 View 作为 ChildViewcontroller,并且我只想在 ChildViewController 中关闭它并转到上一个 ViewController 来自 ParentVie
我有一个来自 Realm 的对象,我将每个控件分配给对象,我想要的是将每个 childVC 上分配的每个对象传递给下一个 childVC。 我在 UIPageViewcontroller 上初始化了该
我有一个看起来像这样的父/ subview Controller 系统 -- (Parent) RootViewController -- (Child) ChildController
最新更新:我创建了一个全新的项目,其构建方式与下面完全相同。然而,这个测试项目实际上工作得很好,即使它看起来是一样的......我注意到的一件事是损坏版本中的父 View Controller 正在接
我尝试实现左侧面板,但是当我实现时,它似乎除了容器之外不会显示任何内容。 下面是我的代码: override func viewDidLoad() { super.viewDidLoad()
我有一个继承自 BaseViewController.swift 的类。我已经为核心数据更改跟踪定义了一个标志: var coreDataUpdated: Bool? 我还在 BaseViewCont
我有一个 pageViewController (UIPageViewController),它有一个 subview Controller (名为 soundPlayer)。声音播放器有静态 AVA
我在 UICollectionViewController 上有一个 childViewController。我有所以我的 childViewController 出现在屏幕上。但是当我注册一个单元格
我在我的 iOS 应用程序中创建了一个汉堡包菜单。 我的 rootViewController 中有一个 navigationBar 但现在我需要将 navigationBar 移动到我的 child
好吧,希望我能解释得尽可能清楚。 我有一个 Parent ViewController,它有一个 ContainerView,它将包含不同的 viewControllers/Class。我正在像这样在
我有一个 View Controller ,其中有一个按钮和一个窗口。 按下按钮,窗口中的 View 应该改变。 窗口中的 View 是另一个 ViewController 及其 View 。 当按下
我正在使用 XLPagerTabStrip在 Swift 4 中创建一个基于类别的阅读应用程序。我了解到可以使用以下函数轻松创建静态数量的 ViewController。 override func
在实现与 subview Controller 连接的 View 容器时,我偶然发现了一个奇怪的问题。 层次结构如下: 我有一个 UISplitViewController,在 MasterViewC
我有一个 ViewController,它有添加按钮,该按钮将在屏幕右侧打开 SideBarVC。如果我再次点击主 ViewController 屏幕,它应该关闭我的 SideBarVC。 我试过了
我在我的 MainViewController 中放置了一个容器。然后在该容器内添加FirstViewController let containerView = UIView() view.addS
我有一个 ViewController,我可以像这样在其中添加许多 child : [self addChildViewController:myViewController]; 在此
这个问题在这里已经有了答案: Passing data between view controllers (45 个答案) 关闭 8 年前。 我有 2 个 View ,ParentViewContr
我正在尝试在 iPad 上从使用 UIPopoverController 切换到 ChildViewControllers。我们有 4 或 5 个 VC 在父导航 subview Controller
我有一个 UIPageViewController,它有三个 childViewController。这些 childViewControllers 正在显示图表,每 5 秒使用从网络连接获取的动态数
我是一名优秀的程序员,十分优秀!