我有一个以UISplitViewController作为初始控制器的应用程序,它有一个主视图控制器和一个详细视图控制器(嵌入在 UINavigationControllers 中)作为其子视图控制器,在 Interface Builder 中布局。分割视图控制器的PreferredDisplayMode设置为.primaryHidden。
我刚刚升级到 Xcode 9.2,它在模拟器中使用 iOS 11.2。当我在 iPhone(设备或模拟器)上启动应用程序时,我在启动时看到一个新行为:在详细视图控制器上的viewDidLoad()之前调用 viewWillDisappear (_:) 。此时,详细视图控制器尚未加载 - 它的所有 IBOutlet 均为 nil。调用之后,系统会像往常一样加载视图并调用viewDidLoad()。
我发现这一点是因为viewWillDisappear(_:)方法访问了 UITextField 以检查它是否是第一响应者。在下面的代码中,文本字段通过 IBOutlet 连接到 UITextField:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if textfield.isFirstResponder {
textfield.resignFirstResponder()
}
}
Run Code Online (Sandbox Code Playgroud)
由于视图尚未加载,文本字段为零,应用程序崩溃了。通过添加 nil 测试很容易解决这个问题。但在 Xcode 和 iOS 的早期版本中,崩溃并没有发生,因为我认为在加载视图之前没有调用viewWillDisappear(_:) 。
另外有趣的是,在 iPad(设备或模拟器)上运行 iOS 11.2 的 Xcode 9.2 不会发生这种情况。在 iPad 上,在详细视图控制器上启动时不会调用viewWillDisappear(_:) 。
这看起来像是一个错误:为什么应该在视图在启动时实际加载之前在详细视图控制器(或任何视图控制器)上调用viewWillDisappear(_:) 。 …
我创建了一个模因生成器应用程序来更好地学习 Swift 和 Xcode。我正在学习当用户与会被键盘遮挡的文本字段交互时移动视图。我有这个功能,只有一个例外。所需的功能是在用户为底部文本字段输入文本时让视图向上滑动,bot 顶部。无论用户与之交互的文本字段如何,视图都会向上滑动。
如何仅将此功能分配给底部文本字段?这是我的源代码:
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {
@IBOutlet weak var imagePickerView: UIImageView!
@IBOutlet weak var cameraButton: UIBarButtonItem!
@IBOutlet weak var topText: UITextField!
@IBOutlet weak var bottomText: UITextField!
let memeTextAttributes:[String:Any] = [
NSAttributedStringKey.strokeColor.rawValue: UIColor.black,
NSAttributedStringKey.foregroundColor.rawValue: UIColor.white,
NSAttributedStringKey.font.rawValue: UIFont(name: "HelveticaNeue-CondensedBlack", size: 30)!,
NSAttributedStringKey.strokeWidth.rawValue: -5.0]
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
subscribeToKeyboardNotifications()
}
override func viewDidLoad() {
super.viewDidLoad()
// Diable camer a button if camera ource isn't available
cameraButton.isEnabled = UIImagePickerController.isSourceTypeAvailable(.camera)
topText.delegate = self …Run Code Online (Sandbox Code Playgroud)