我有一个针对iOS8的应用,初始视图控制器是UISplitViewController。我使用情节提要,以便
为我实例化所有内容。
由于我的设计,我需要SplitViewController在iPhone上以纵向模式显示主视图和详细视图。因此,我正在寻找一种方法来对此UISplitViewController 覆盖特征收集。
我发现我可以使用
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) { ... }
但是,不幸的是,只有一些方法可以覆盖子控制器特征集:
setOverrideTraitCollection(collection: UITraitCollection!, forChildViewController childViewController: UIViewController!)
and I can’t do so for self in my UISplitViewController subclass.
而且我不能在UISplitViewController子类中自行这样做。
我检查了 Apple 的示例应用“ Adaptive
Photos
。并且在此应用程序中,作者使用特殊的TraitOverrideViewController作为
root用户,并在其viewController setter中使用一些魔术来使其全部起作用。
好的,我希望有另一种解决方法,但是现在我只是将代码从Apple示例转换为Swift,并对其进行了调整以与Storyboards一起使用。
它有效,但是我仍然认为这是实现此目标的糟糕方法。
我的TraitOverride.swift:
import UIKit
class TraitOverride: UIViewController {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
var forcedTraitCollection: UITraitCollection? {
didSet {
updateForcedTraitCollection()
}
}
override func viewDidLoad() {
setForcedTraitForSize(view.bounds.size)
}
var viewController: UIViewController? {
willSet {
if let previousVC = viewController {
if newValue !== previousVC {
previousVC.willMoveToParentViewController(nil)
setOverrideTraitCollection(nil, forChildViewController: previousVC)
previousVC.view.removeFromSuperview()
previousVC.removeFromParentViewController()
}
}
}
didSet {
if let vc = viewController {
addChildViewController(vc)
view.addSubview(vc.view)
vc.didMoveToParentViewController(self)
updateForcedTraitCollection()
}
}
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) {
setForcedTraitForSize(size)
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}
func setForcedTraitForSize (size: CGSize) {
let device = traitCollection.userInterfaceIdiom
var portrait: Bool {
if device == .Phone {
return size.width > 320
} else {
return size.width > 768
}
}
switch (device, portrait) {
case (.Phone, true):
forcedTraitCollection = UITraitCollection(horizontalSizeClass: .Regular)
case (.Pad, false):
forcedTraitCollection = UITraitCollection(horizontalSizeClass: .Compact)
default:
forcedTraitCollection = nil
}
}
func updateForcedTraitCollection() {
if let vc = viewController {
setOverrideTraitCollection(self.forcedTraitCollection, forChildViewController: vc)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
performSegueWithIdentifier("toSplitVC", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "toSplitVC" {
let destinationVC = segue.destinationViewController as UIViewController
viewController = destinationVC
}
}
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
}
要使其工作,您需要在情节提要板上添加新的UIViewController并将其设置为初始。将show segue从其中添加到您的真实控制器中
现在它也应该为您工作。如果您找到更好的方法或此方法有任何缺陷,请告诉我。
我以前见过这样做,但我不记得如何有效地初始化已知长度的与长度相同的。这里有一个很好的例子: 我已经仔细阅读了这一页关于高级矩阵初始化的内容,但是没有明确解释执行此操作的方法。
问题内容: 在我的Django(1.2)项目中,我想以模型形式预填充字段,但是新值将被忽略。这是代码段: 我也尝试了使用,但没有效果:总是在表单中显示数据库值。有任何想法吗? 问题答案: 尝试这个:
我定义了一个通用的环境特征: 为此,我提供了以下实现: 此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法: 对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。 然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]: 错误:方法e
我已经用情节提要制作了我的应用程序,并且设置了项目选项- 现在我有了一个视图控制器(TestViewController),它是故事板的一部分,我想锁定方向(只是纵向)。我已经重写了这些方法,但TestViewController会像其他方法一样旋转。ShouldAutorotate未调用,SupportedInterfaceOrientations激发,但结果与其他视图相同。 环境 MonoTo
问题内容: 我正在使用maven-jetty-plugin并尝试使用-Djetty.port = 8090覆盖我的jetty.xml设置,但是它不起作用。仅当我从jetty.xml文件中删除连接器部件时,端口才是8090。 所以: 随着连接器在端口8080中启动 如果没有在端口8090中启动连接器 问题是我需要配置接受器,统计信息和其他内容。我尝试仅从连接器中删除端口,但是没有用。 我正在使用:
问题内容: 如何以编程方式为情节提要设置?我想根据不同的启动条件将情节提要板打开到其他视图。 问题答案: 如何 不 使用虚拟初始视图控制器 确保所有初始视图控制器都有一个Storyboard ID。 在情节提要中,取消选中第一个视图控制器中的“是初始视图控制器”属性。 如果您此时运行应用程序,则将阅读: 您会注意到,应用程序委托中的window属性现在为nil。 在应用程序的设置中,转到目标和选项