【问题标题】:How call the object from an other swift file如何从其他 swift 文件中调用对象
【发布时间】:2015-07-02 10:06:57
【问题描述】:

我用 Swift 构建了一个 iOS 应用程序。如果“上一个”网页的按钮在另一个 swift 文件“widgetcontroller”中,如何从“mainviewcontroller”获取/调用 webview 对象。

在带有“webview”对象的“mainviewcontroller”文件中。

import Foundation
import UIKit
import WebKit

class MainViewController: UIViewController, WKScriptMessageHandler, WKNavigationDelegate {
    @IBOutlet var webView : WKWebView!  
override func loadView() {
        super.loadView()
    }

    @IBAction func history(sender: AnyObject) {
        webView?.goBack()
    }
}

另一个文件是按钮。

import Foundation
import UIKit

class WidgetViewController: UIViewController {

override func viewDidLoad() {
        self.booktransitionManager.sourceViewController = self
        super.viewDidLoad()
    }

     @IBAction func goprevious(sender: AnyObject) {
            MainViewController.history()
        }
}

goprevious -> 链接到按钮“修饰”操作。

当我运行它时,它会使 iPhone 应用程序崩溃。知道如何解决这个问题吗?

【问题讨论】:

  • 通常的方式是实现一个协议和一个委托。有很多例子可以做到这一点
  • 您需要以某种方式引用您的 MainViewController 。这可以通过多种不同的方式来实现。请发布更多上下文和代码。
  • @pe60t0 查看 MainViewController 的更新代码
  • 是的,你不能这样做——像这样调用 history() 方法是无效的。阅读有关如何使用委托模式的信息。基本上,您需要一个对象将 goprevious() 方法委托回 MainViewController 。出于好奇 - 你所说的“其他文件是按钮”是什么意思?这些视图控制器是如何呈现的?
  • 网上可以很容易找到objective-c/swift中委托模式的使用方法

标签: ios swift uiwebview callback wkwebview


【解决方案1】:

您可以通过以下任何方式执行此操作:

  1. 当第二个控制器离开时发送通知并让父级监听它。如:

添加观察者:

    NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "viewHistory:",
    name: "ViewHistory",
    object: nil)

观察者法:

@objc func viewHistory(notification: NSNotification){     
    //do stuff
}

来电通知

NSNotificationCenter.defaultCenter().postNotificationName("ViewHistory", object: nil)
  1. 创建一个委托协议,让第二个控制器直接引用父方法。

  2. 使用父级的 viewWillAppear: 并检查 isMovingToParentViewController 属性是否刚刚重新出现。

并应用最适合您的价值传递条件和价值可用性的方法。

【讨论】:

  • 这对您有帮助吗?
【解决方案2】:

你可以使用NSNotificationCenter如下

//For add observer
@IBAction func goprevious(sender: AnyObject) {
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "history:", name: "give_name_of_observer", object: nil)
}

//For remove observer
 @IBAction func history(sender: AnyObject) {
      NSNotificationCenter.defaultCenter().removeObserver(self, name: "give_name_of_observer", object: nil)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2019-12-29
    相关资源
    最近更新 更多