将数据附加到 Swift 中的 URL

Appending Data To URL In Swift

这可能是一个基本问题,但我正在尝试弄清楚如何通过视图控制器将 "append" 字符串转换为 URL,并让它们得到维护。更具体地说;

我正在构建一个基本的文件浏览器应用程序,它从网络服务(XML)表单中获取数据。每次用户点击 "folder"(在 Table 视图中显示为文件夹列表)时,都会通过 NSURL 会话发出另一个请求以获取内容那个文件夹。

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

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 到它自己,并重新加载 table,我认为这是按预期工作的,但我试图让url string 继续将点击的行附加到末尾,而不是每次都忘记。我正在考虑使用 NSUserDefaults 来保留最后一个 URL,但我意识到这一定很常见,也许有更好的方法。谢谢!

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

func cellTapped() {
    currentUrl += tappedRow
}

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

var urlString = "http://myurl"

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

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

您可以使用 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("/") { [=10=] +  + "/" }
        let adddress = Stack.basePath + folders
        return NSURL(string: adddress)!
    }
}

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

  1. 当您要将文件夹添加到路径时调用 push
  2. 当您要删除最后添加的文件夹时调用 pop

这是一个例子:

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 是单例,因此您不需要将对同一 Stack 对象的引用从一个视图控制器传递到另一个视图控制器。每次您在应用程序中编写 Stack.sharedInstance 时,您都会自动获得对 Stack 唯一实例的引用。

希望对您有所帮助。