2015-11-13 57 views
1

我正在處理一個項目,該項目發送一些HTTP命令,並帶有用戶在文本字段中定義的IP地址。 IP地址本質上是爲我的應用程序管理許多不同的功能。正如我所做的那樣,我一直在遇到「實例成員無法用於類型」錯誤。在變量聲明的基本原理中,執行以下操作的正確方法是什麼?我將有大約40-50個不同的請求。Xcode Swift 2變量聲明(實例成員不能在類型視圖控制器上使用)

@IBOutlet weak var myIPaddress: UITextField! 
var baserequest = "http://\(myIPaddress):8088/api/?function=" 
var requestA = "\(baserequest)myFunctionA&value=abc" 
var requestB = "\(baserequest)myFunctionB&value=xyz" 
var requestC = "\(baserequest)myFunctionC&value=123" 
... 
... 

我不知道這事,但因爲我們使用HTTP命令聲明一個看起來像這樣

var program1 = NSMutableURLRequest(URL: NSURL(string: "\(baseRequest)activeinput&input=1")!) 

* UPDATE *

我不知道我的問題是。這是我的代碼,它仍然拋出這個錯誤。在

var request1 = NSMutableURLRequest(URL: NSURL(string: "\(baserequest)activeinput&input=1")!) 

所以這是我的全部代碼

import UIKit 
import Foundation 


func httpGet(request: NSURLRequest!, callback: (String?, NSError?) -> Void) { 
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
    guard error == nil && data != nil else { 
     callback("", error) 
     return 
    } 

    callback(String(data: data!, encoding: NSUTF8StringEncoding), nil) 
} 
task.resume() 
} 

class FirstViewController: UIViewController, UITextFieldDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 



@IBOutlet weak var vmixip: UITextField! 
var baserequest: String = "" 

func textFieldDidEndEditing(textField: UITextField) { 
    updateBaseRequest(textField.text!) 
} 

func updateBaseRequest(vmixip: String) { 
    baserequest = "http://\(vmixip):8088/api/?function=" 
} 

var request1 = NSMutableURLRequest(URL: NSURL(string: "\(baserequest)activeinput&input=1")!) 
@IBAction func Program1(sender: UIButton) { 
    if let image = UIImage(named:"g1") { 
     sender.setImage(image, forState: .Normal) 
    } 
    httpGet(request1) { string, error in 
     guard error == nil && string != nil else { 
      print(error?.localizedDescription) 
      return 
     } 

     print(string!) // 
    } 


} 

} 
+0

你究竟在哪裏得到這個錯誤? – beeef

+0

你有幾個問題,1,你需要引用'myIPaddress.text'來獲取文本字段中的字符串,但更重要的是,無論如何你都無法使用該值,因爲你結束更新' baseRequest'和所有其他變量在用戶更改字段時,所以您需要編寫類似於UiTextFieldDelegate的代碼來執行此操作。 – Paulw11

+0

Hi Seth。你會考慮對你收到的答案和/或接受其中的一個答覆嗎?這是我們在這裏獎勵有用答案的方式。 – halfer

回答

1

「實例成員不能在類型中使用」錯誤正在被引用的是尚未公佈值造成的。

例如,你不能有

var myValue = "something" 

,然後在

var myValueAgain = self.myValue 

再次引用值的屬性初始化不以功能類似的代碼工作。這是因爲「自我」在對象創建之前不可用。您正在嘗試訪問「自我」之前,它是可用的。


另一個問題是,你指的是一個UITextField,用於

var baserequest = "http://\(myIPaddress):8088/api/?function=" 

而用,你可以使用String類型的值是

myIPaddress.text 

分配在初始化值也不會自動更新值,因爲它在UI中發生變化。

處理文本字段的變化需要UITextFieldDelegate

  • textFieldDidBeginEditing:
  • textFieldDidEndEditing:

您可以使用這些方法來更新您的baserequest當用戶更新在文本實現方法文本字段。

因此,你的類將有這樣的事情

class MyViewController: UIViewController, UITextFieldDelegate { 

    var baserequest: String 

    func textFieldDidEndEditing(textField: UITextField) { 
     updateBaseRequest(textField.text) 
    } 

    func updateBaseRequest(ipAddress: String) { 
     baserequest = "\(ipAddress)..." 
    } 
} 
+0

對不起,我不知道我在這裏錯過了什麼。這是我的代碼。 –

+0

如果您根據請求編號或諸如'func getRequest(requestNumber:Int) - > String'等函數來獲取請求,那麼您將避免實例成員無法使用的問題。你需要刪除'var request1 = NSMutableURLRequest(URL:NSURL(string:「\(baserequest)activeinput&input = 1」)!)'來清除錯誤。我的建議是用函數替換它。每次需要獲取URL時,都可以使用該功能。 – Daniel

+0

@SethHaberman我已經更新了我的答案,以更好地解釋發生了什麼。讓我知道這是否有幫助。 – Daniel

2

你應該初始化請求變量的函數,你有用戶的IP地址後。該錯誤試圖告訴您變量的默認值can't something that hasn't been initialized yetmyIPaddress)。

喜歡的東西:

@IBAction func addressEntered(sender: UIButton) { 
    // NOTE: Use myIPaddress.text to get the text 
    baserequest = "http://\(myIPaddress.text):8088/api/?function=" 
    requestA = "\(baserequest)myFunctionA&value=abc" 
    requestB = "\(baserequest)myFunctionB&value=xyz" 
    requestC = "\(baserequest)myFunctionC&value=123" 
} 

此外,你需要聲明的變量自選如果你需要他們在整個類:

class MyClass { 
    var requestA: String? 
    ... 
} 

或者,你可以把你的請求變量到computed properties

class MyClass { 
    var baseRequest: String? 
    var requestA: String { 
     // Beware, this would crash if used before baseRequest was initialized 
     return "\(baseRequest!)myFunctionA&value=abc" 
    } 
} 
相關問題