在Swift中将数据附加到URL

时间:2015-08-10 14:41:39

标签: swift nsurl

这可能是一个基本问题,但我试图弄清楚如何通过视图控制器将字符串“附加”到URL,并让它们维护。更具体地说;

我正在构建一个基本的文件浏览器应用程序,它从Web服务(XML格式)中获取数据。每次用户点击“文件夹”(在表格视图中显示为文件夹列表)时,都会通过NSURL会话发出另一个请求,以获取 文件夹的内容。< / p>

我的问题是,URL字符串仅附加用户点击的行的名称,但我不确定如何填充用户点击的所有行。

let urlString = "http://myurl/"

用户点击所需的文件夹后......

let urlString = "http://myurl/\(tappedRow)"
// This prints as http://myurl/firstfoldername/

用户点击下一个想要的文件夹后......

let urlString = "http://myurl/\(tappedRow)"
// This prints as http://myurl/secondfoldername/
// But I want http://myurl/firstfoldername/secondfoldername/

由于我只是从TableViewController转向自身,并重新加载表,我认为这是正常的,但我试图让url字符串继续将tapped行追加到最后,而不是忘记每一行时间。我在考虑使用NSUserDefaults保留最后一个URL,但我意识到这一定是常见的事情,也许还有更好的方法。谢谢!

3 个答案:

答案 0 :(得分:1)

override func viewDidLoad() {
    super.viewDidLoad()
    let baseUrlString = "http://myUrl/"
    var currentUrl = baseUrlString 
}

func cellTapped() {
    currentUrl += tappedRow
}

答案 1 :(得分:0)

urlString声明为任何方法之外的实例变量

var urlString = "http://myurl"

定义一个函数addPathComponent()并在每次点击一行时调用它,并将文件夹名称作为参数传递。使用方法stringByAppendingPathComponent可以避免与斜杠路径分隔符混淆。

func addPathComponent(component : String)
{
  urlString = urlString.stringByAppendingPathComponent(component)
  // do something with the new urlString value
}

答案 2 :(得分:0)

您可以使用Stack of Strings。我准备了这个singleton class

class StackFolder {
    private var path = [String]()
    static let sharedInstance = StackFolder()
    private init() {}
    static private let basePath = "http://myurl"
    var baseURL = NSURL(string: basePath + "/")!

    func push(folder: String) {
        path.append(folder)
    }

    func pop() {
        path.removeLast()
    }

    func toURL() -> NSURL {
        let folders = path.reduce("/") { $0 + $1 + "/" }
        let adddress = Stack.basePath + folders
        return NSURL(string: adddress)!
    }
}

您只需要检索Stack的共享实例,并且:

  1. 如果要将文件夹添加到路径
  2. ,请调用push
  3. 如果要删除最后添加的文件夹,请调用pop
  4. 这是一个例子:

    StackFolder.sharedInstance.push("folder1")
    StackFolder.sharedInstance.toURL().absoluteString // "http://myurl/folder1/"
    StackFolder.sharedInstance.push("folder2")
    StackFolder.sharedInstance.toURL().absoluteString // "http://myurl/folder1/folder2/"
    StackFolder.sharedInstance.pop()
    StackFolder.sharedInstance.toURL().absoluteString // "http://myurl/folder1/"
    

    由于Stack是Singleton,因此您无需将对同一Stack对象的引用从一个视图控制器传递给另一个视图控制器。每次在应用程序中编写Stack.sharedInstance时,您都会自动获得对Stack唯一实例的引用。

    希望这有帮助。