Как я могу использовать swiftyJSON dictionaryValue в качестве используемой строки для UILabel?

У меня есть метод makeRequest() внутри UITableViewController со следующим кодом:

    func makeRequest() {

    Alamofire.request(.GET, self.foursquareEndpointURL, parameters: [
        //"VENUE_ID" : self.foursquareVenueID,
            "client_id" : self.foursquareClientID,
            "client_secret" : self.foursquareClientSecret,
            "v" : "20140806"
            ])
        .responseJSON(options: nil) { (_, _, data, error) -> Void in
        if error != nil {
            println(error?.localizedDescription)
        } else if let data: AnyObject = data {
            let jObj = JSON(data)
            if let venue = jObj["response"]["venue"].dictionaryValue as [String: JSON]? {
                self.responseitems = jObj
                println("venue is: \(venue)")
            }
            dispatch_async(dispatch_get_main_queue()) {
                self.tableView.reloadData() // Update UI
            }
        }
    }
}

также имейте в виду, что у меня есть недвижимость var responseitems:JSON = []

println("venue is: \(venue)") выводит на консоль красивый ответ, так что я знаю, что он работает правильно ...

У меня также есть собственный класс UITableViewCell с методом bindData() со следующим кодом:

func bindData() {
    println("VenueDetailHeaderCell data did set")
    self.venueDetailTitleLabel.text = self.headerInfo?["name"].stringValue
    let labelData = self.headerInfo?["name"].stringValue
    println("labelData is: \(labelData)")
}

Как видите, я пытаюсь установить для текста UILabel значение ["name"]. StringValue в ответе JSON. Однако, когда я println("labelData is: \(labelData)"), я получаю в консоли вывод labelData: Необязательный (""), который, очевидно, пуст.

Вот скриншот того, что я пытаюсь захватить

введите описание изображения здесь

Что я здесь делаю не так и как я могу получить название места и назначить ему свой UILabel?

ОБНОВИТЬ:

Я пробовал следующий код

let labelData = self.headerInfo?["name"].error
    println("labelData is: \(labelData)")

И получите консольный вывод: "Error Domain = SwiftyJSONErrorDomain Code = 901" Ошибка массива [0], это не массив "UserInfo = 0x7fd6d9f7dc10 {NSLocalizedDescription = Array [0] failure, This is not an array}" Если это пригодится кому угодно. Я действительно запутался ... Есть идеи?


person Steven Schafer    schedule 19.04.2015    source источник
comment
Где вы устанавливаете значение для self.headerInfo в своем пользовательском UITableViewCell? Я предполагаю, что вы хотите, чтобы это было установлено для объекта venue JSON. Однако не похоже, чтобы вы когда-либо делали это в любом из предоставленных вами примеров кода.   -  person cnoon    schedule 19.04.2015
comment
@cnoon Я делаю var headerInfo:JSON? { didSet { self.bindData() } }   -  person Steven Schafer    schedule 20.04.2015


Ответы (2)


Проблема в том, что значение headerInfo является объектом ошибки JSON, потому что вы пытаетесь получить доступ к словарю с целочисленным индексом.

Обратите внимание, что var responseitems:JSON = [] не создает объект массива. SwiftyJSON имеет конструкторы автоматического присваивания (я новичок в swift, поэтому не уверен, что такое правильная терминология swift) ... см. Этот инициализатор в исходном коде SwiftyJSON.swift:

extension JSON: ArrayLiteralConvertible {
    public init(arrayLiteral elements: AnyObject...) {
        self.init(elements)
    }
}

Это означает, что когда вы делаете var responseitems:JSON = [], вы не создаете массив, вы создаете объект JSON, который конструируется с пустым массивом, используя вышеуказанный метод init. Затем, когда вы выполняете self.responseitems = jObj, вы повторно назначаете эту responseitems переменную объекту JSON со словарем в нем. Следовательно, self.responseitems[0] недействителен.

Также обратите внимание, что в SwiftyJSON нет такого понятия, как необязательный объект JSON. Я заметил, что в вашем комментарии вы говорите, что делаете var headerInfo:JSON? ... - невозможно иметь необязательный JSON.

var headerInfo: JSON = nil

Вышеупомянутое возможно - здесь используется другой автоинициализатор, который инициализирует действительный объект JSON, представляющий нулевое значение JSON.

Итак, как это исправить?

Когда вы назначаете headerInfo, делайте это так:

let headerInfo = self.responseitems["response"]["venue"]

А теперь в bindData вы можете:

self.venueDetailTitleLabel.text = self.headerInfo["name"].stringValue

Обратите внимание, что все вышеперечисленное предполагает Swift 1.2 и SwiftyJSON> = 2.2 - также после того, как вы поняли вышесказанное и исправили проблему, вы, вероятно, захотите немного реорганизовать код, чтобы отразить исправленное понимание модели данных.

person jhabbott    schedule 19.04.2015
comment
Это сработало! Спасибо. Однако я не получаю ошибок для var headerInfo:JSON?. Означает ли это, что на самом деле можно сделать это необязательным? Я поставил? там в качестве проверки, чтобы предотвратить сбой, если он вернул ноль. Кроме того, что бы вы порекомендовали по поводу рефакторинга кода, чтобы отразить исправленное понимание модели данных? Спасибо еще раз - person Steven Schafer; 20.04.2015
comment
Создание headerInfo: JSON? не является ошибкой или проблемой, но я хочу сказать, что, даже если это необязательно, вы никогда не получите значение nil, всегда действительный объект JSON. Однако вы все равно можете проверить headerInfo == nil, но обратите внимание, что это не делает то, что вы думаете. Он создает действительный объект JSON, инициализированный с помощью nil (внутренне сохраненный как NSNull) с правой стороны, а затем сравнивает его с вашим headerInfo с левой стороны. Установите точку останова и войдите в код, чтобы увидеть, что произойдет. Re. рефакторинг - не беспокойтесь об этом, это было бы просто разборчивостью. - person jhabbott; 20.04.2015
comment
Ах я вижу! В этом есть смысл. Огромное спасибо - person Steven Schafer; 20.04.2015

Способ разбора следующий

element: JSONValue //Something with JSONValue
if let title = element["name"]?.string {
    cell.title.text = title
}
person Eduardo Iglesias    schedule 19.04.2015
comment
Извините, я должен был указать это var responseitems:JSON = [] Итак, я безуспешно делаю то, что вы предлагаете. - person Steven Schafer; 19.04.2015
comment
Я также делаю var headerInfo:JSON? { didSet { self.bindData() } } в VenueDetailHeaderCell, который является классом UITableView - person Steven Schafer; 20.04.2015