大佬教程收集整理的这篇文章主要介绍了swift – 合并视图而不是单独显示它们,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这就是我所做的
import Safariservices class SafariExtensionViewController: SFSafariExtensionViewController { @IBOutlet weak var passwordmessage: NSTextField! @IBOutlet weak var emailmessage: NSTextField! @IBOutlet weak var message: NSTextField! @IBOutlet weak var email: NSTextField! @IBOutlet weak var password: NSSecureTextField! static let shared = SafariExtensionViewController() override func viewDidLoad() { self.preferredContentSize = NSSize(width: 300,height: 250) message.stringvalue = "" emailmessage.stringvalue = "" passwordmessage.stringvalue = "" } override func viewDidAppear() { if let storedEmail = UserDefaults.standard.object(forKey: "email") as? String { if let stepView = Bundle.mainBundle.loadNibNamed(NSNib.Name(rawValue: "ExtensionStepsViewController"),owner: nil,topLevelObjects: nil)[0] { self.view.addSubview(stepView) } } } @IBACtion func userLogin(_ sender: Any) { let providedEmailAddress = email.stringvalue let providedpassword = password.stringvalue let isEmailAddressvalid = isValidEmailAddress(emailAddressString: providedEmailAddress) self.message.stringvalue = "" emailmessage.stringvalue = "" passwordmessage.stringvalue = "" if isEmailAddressvalid && providedpassword.count > 0 { /* login process is handled here and store the email in local storage /* /* TODO for Now email is not stored in browser localstorage which has to be fixed */ let controller = "ExtensionStepsViewController" let subview = ExtensionStepsViewController(nibName: NSNib.Name(rawValue: controller),bundle: nil) self.view.addSubview(subview.view) } } }
这样我得到的错误就像Type Bool没有下标成员我的文件结构看起来像这样.
我正在使用Xcode 10,swift 4,一切都是新的.
我在viewDidAppear中使用了以下块(如果localstorage中有电子邮件,然后显示扩展步骤视图而不是登录屏幕)和登录成功时内部登录功能,但它没有导航到该ExtensionStepsView
let controller = "ExtensionStepsViewController" let subview = ExtensionStepsViewController(nibName: NSNib.Name(rawValue: controller),bundle: nil) self.view.addSubview(subview.view)
true[0]
var topLevelObjects : NSArray? if Bundle.main.loadNibNamed(NSNib.Name(rawValue: "ExtensionStepsViewController"),owner: self,topLevelObjects: &topLevelObjects) { let topLevelObjects!.first(where: { $0 is NSView }) as? NSView }
视图已合并,因为您没有从superview中删除先前的视图,并将ExtensionStepsViewController中的视图添加到同一个superview.
您可以执行以下步骤来完成您的问题:
>使SafariExtensionViewController继承自SFSafariExtensionViewController,它将是两个子视图控制器(如LoginViewController和ExtensionStepsViewController)的容器(和父),并将用于在它们之间导航.
>单独制作LoginViewController和ExtensionStepsViewController(均继承自简单的NSViewController)及其xib.
>用户从LoginViewController到ExtensionStepsViewController登录transit之后
作为示例,但是您必须使用您的实现SafariExtensionViewController而不是ParentViewController,如上所述.
public protocol LoginViewControllerDelegate: class { func loginViewControllerDidLoginsuccessful(_ loginVC: LoginViewController) } public class LoginViewController: NSViewController { weak var delegate: LoginViewControllerDelegate? @IBACtion func login(_ sender: Any) { // login logic let isLoginsuccessful = true if isLoginsuccessful { self.delegate?.loginViewControllerDidLoginsuccessful(self) } } } public class ExtensionStepsViewController: NSViewController { } public class ParentViewController: NSViewController,LoginViewControllerDelegate { weak var login: LoginViewController! // using of force unwrap is anti-pattern. consider other solutions weak var steps: ExtensionStepsViewController! public override func viewDidLoad() { let login = LoginViewController(nibName: NSNib.Name(rawValue: "LoginViewController"),bundle: nil) login.delegate = self // change login view frame if needed login.view.frame = self.view.frame self.view.addSubview(login.view) // instead of setTing login view frame you can add appropriate layout consTraints self.addChildViewController(login) self.login = login let steps = ExtensionStepsViewController(nibName: NSNib.Name(rawValue: "ExtensionStepsViewController"),bundle: nil) steps.view.frame = self.view.frame self.addChildViewController(steps) self.steps = steps } // MARK: - LoginViewControllerDelegate public func loginViewControllerDidLoginsuccessful(_ loginVC: LoginViewController) { self.transition(from: self.login,to: self.steps,options: .slideLeft) { // completion handler logic print("transition is done successfully") } } }
Here是这个例子的快捷游乐场.
UPD:
您可以通过以下几种方式实例化NSViewController:
>使用允许从.storyboard文件加载NSViewController视图的NSStoryboard:
let storyboard = NSStoryboard(name: NSStoryboard.Name("NameOfStoryboard"),bundle: nil) let viewController = storyboard.instantiateController(withIdentifier: NSStoryboard.ScenEIDentifier("NSViewControllerIdentifierInStoryboard"))
>使用NSViewController的相应initialiser从.xib文件加载它的视图:
let steps = ExtensionStepsViewController(nibName: NSNib.Name(rawValue: "ExtensionStepsViewController"),bundle: nil)
>使用默认初始化程序,但如果xib文件的名称与视图控制器类的名称不同,则必须通过重写loadView()方法直接加载视图:
let steps = ExtensionStepsViewController() // Also you have to override loadView() method of ExtensionStepsViewController.
以上是大佬教程为你收集整理的swift – 合并视图而不是单独显示它们全部内容,希望文章能够帮你解决swift – 合并视图而不是单独显示它们所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。