无法使用&#39;(String)&#39; </method>类型的参数列表调用<method>

时间:2015-04-12 00:46:09

标签: xcode swift viewcontroller appdelegate

我正在尝试编写一个OSX应用程序。此应用程序的功能是显示计算机IP地址。 打开程序时获取地址(AppDelegate.swift):

@NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate {

      var ipadd:String = ""
      var path:String = ""
      var status:String = ""


      func applicationDidFinishLaunching(aNotification: NSNotification) {
             ipadd = getIFAddress()  //<-- ip stored in here as String
             println(ipadd)   //successfully prints out the ip
             ViewController.setIpDisp(ipadd)   //error on this line

      }
   ...
 }

在ViewController.swift中:

class ViewController: NSViewController {

    @IBOutlet weak var ip: NSTextField!
    ...

    func setIpDisp(ipin: String){
         ip.stringValue = ipin 
    }

确切地说,错误是“无法使用'(String)'类型的参数列表调用'setIpDisp'

由于

2 个答案:

答案 0 :(得分:2)

AppDelegate正在尝试调用正在视图控制器视图中更新ViewController的{​​{1}}方法。它需要一个有效的@IBOutlet实例来执行此操作。

但这是倒退的:应用委托代表不应该尝试调用视图控制器方法。视图控制器可以调用应用程序委托的方法/属性,但应用程序委托实际上不应该调用视图控制器方法。

如果您需要更新视图控制器中的IP号字段,那么视图控制器应该启动它(例如在ViewController中):

viewDidLoad

或者,如果您愿意,class ViewController: NSViewController { @IBOutlet weak var ip: NSTextField! override func viewDidLoad() { super.viewDidLoad() updateIpDisp() } func updateIpDisp() { let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate ip.stringValue = appDelegate.getIFAddress() } } 在其AppDelegate方法中设置一些ipadd字符串属性(不是init),然后是applicationDidFinishLaunching方法也可以从app委托中检索属性的值。 (鉴于IP号码是动态的并且可以改变,这对我来说似乎不对,但是无论如何都要这样做。)无论如何,这可能看起来像:

updateIpDisp()

class AppDelegate: NSObject, NSApplicationDelegate {

    var ipadd: String!

    override init() {
        super.init()

        ipadd = getIFAddress()
    }

}

但视图控制器应该从应用程序委托请求IP号并更新其自己的视图。但是,app delegate在视图控制器中没有业务调用方法。

答案 1 :(得分:1)

你的功能不是静态的,所以一定要初始化它的实例,如下所示

    @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate {
      let viewController = ViewController()

      var ipadd:String = ""
      var path:String = ""
      var status:String = ""


      func applicationDidFinishLaunching(aNotification: NSNotification) {
             ipadd = getIFAddress()  //<-- ip stored in here as String
             println(ipadd)   //successfully prints out the ip
             viewController.setIpDisp(ipadd)   //error on this line

      }
   ...
 }