Skip to main content
 首页 » 编程设计

xcode之无法使用类型为 '(String)' 的参数列表调用

2024年01月01日55dflying

我正在尝试编写一个 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’

谢谢

请您参考如下方法:

AppDelegate 正在尝试调用 ViewController 方法来更新 View Controller View 中的 @IBOutlet。它需要一个有效的 ViewController 实例来执行此操作。

但这是倒退的:应用程序委托(delegate)不应该尝试调用 View Controller 方法。 View Controller 可以调用应用程序委托(delegate)的方法/属性,但应用程序委托(delegate)实际上不应该调用 View Controller 方法。

如果您需要更新 View Controller 中的 IP 号码字段,那么 View Controller 应该启动此操作(例如在 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 在其 init 方法中设置一些 ipadd 字符串属性(不是 applicationDidFinishLaunching),然后 updateIpDisp() 方法也可以从应用委托(delegate)中检索属性值。 (考虑到 IP 号码是动态的并且可以更改,这对我来说似乎不正确,但是您可以随心所欲地进行。)无论如何,这可能看起来像:

class AppDelegate: NSObject, NSApplicationDelegate { 
 
    var ipadd: String! 
 
    override init() { 
        super.init() 
 
        ipadd = getIFAddress() 
    } 
 
} 

和

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.ipadd 
    } 
 
} 

但是 View Controller 应该从应用代理请求 IP 号并更新它自己的 View 。但是应用程序委托(delegate)在 View Controller 中没有业务调用方法。