【问题标题】:UIView created in Interface Builder not rendering as expected在 Interface Builder 中创建的 UIView 未按预期呈现
【发布时间】:2014-12-16 02:24:32
【问题描述】:

我正在尝试了解 iOS 开发(Swift + Xcode 6),并且我正在尝试弄清楚我在 Interface Builder 中所做的事情与我的代码之间的关系。

我所做的是创建PageViewController : UIPageViewController,它在其viewDidLoad 方法中调用setViewControllers 来添加单个视图控制器,即Page11ViewController : UIViewController 的一个实例。

感谢recent question 的有用回答,我现在知道PageViewControllerPage1ViewController 已成功创建。但是,我正在尝试在 IB 中设计Page1ViewController,而呈现的内容并不能反映我在 IB 中所做的工作。在我的故事板中,我有以下内容:

所以“Page 1 View Controller Scene”包含一个包含标签的视图(“Page 1”)。我通过在该视图控制器的 Identity Inspector 中设置其类,使“Page 1 View Controller”成为Page1ViewController 的一个实例:

但是当我运行应用程序时,我看不到带有“第 1 页”标签的白色视图;相反,我看到一个空白的红色视图。为什么是红色?因为我这样做了:

class Page1ViewController : UIViewController {
    @IBOutlet var mainView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.redColor()
        println("Page 1 loaded")
        println("Subviews: \(view.subviews.count)")
    }
}

所以我知道正在执行代码,并且正在那里设置背景...打印出的子视图计数为 0...所以我知道我在 IB Storyboard 中构建的视图不是实际绘制的视图。

这是来自PageViewController 的代码,它添加了Page1ViewController

class PageViewController : UIPageViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        println("Page view controller loaded")
        let page1vc = Page1ViewController()
        setViewControllers([page1vc],
            direction: UIPageViewControllerNavigationDirection.Forward,
            animated: true, completion: nil)
    }
}

如何将我在 IB 中创建的视图附加到代码中?

【问题讨论】:

  • 如果您向下切换黄色“页面 1 视图控制器”下的箭头,您应该会看到一个 UIView 实例。这将自动连接到视图控制器的视图属性。您不需要 UIView IBOutlet。您能否显示实例化第 1 页视图控制器并将其添加到您的页面视图控制器的代码?
  • PageViewController 代码更新了我的问题。是的,我在 Storyboard 的“Page 1 View Controller”下看到了 UIView 实例。

标签: ios swift uikit xcode6


【解决方案1】:

您的问题是您正在实例化一个空的Page1ViewController,而不是从情节提要中加载它,因此它不会连接到您在场景中定义的任何对象。

你应该使用 -

class PageViewController : UIPageViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        println("Page view controller loaded")
        let storyboard = UIStoryboard(name:"MainStoryboard" bundle:nil);

        let page1vc =  storyboard.instantiateViewControllerWithIdentifier("page1ViewController") as Page1ViewController // Check the Storyboard ID for your scene in the storyboard  
        setViewControllers([page1vc],
            direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)
    }
}

【讨论】:

  • 这看起来正是我正在寻找的...让我试试这个并回复你。感谢您的快速响应。
  • 哎呀,伙计,这就像一个魅力!你不仅回答了这个问题,还帮助我理解了这一切是如何更好地结合在一起的。谢谢你。后续问题:这是最好的方法吗?有什么方法我应该在 IB 中连接这些东西,而不是在代码中做吗?我正处于不知道在哪里使用什么工具的那个阶段。
  • 您不能在 Interface Builder 中直接链接页面视图控制器 - 通常您会使用数据源委托来根据需要提供视图控制器。这是一个教程 - appcoda.com/uipageviewcontroller-storyboard-tutorial
  • 啊,是的,我确实读过有关使用数据源的信息。我没有走那条路,因为我不一定觉得它在这个应用程序中有意义——但当然我还没有真正理解这个框架,所以我的直觉是可疑的。再次感谢您清晰的回答。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2014-09-29
  • 2017-01-26
相关资源
最近更新 更多