2015-11-13 54 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" 
    } 
} 
相关问题