Работа с массивом и tableView

swift

#1

Здравствуйте помогите пожалуйста.
Есть два VC, на обоих есть tableView.
Существуют данные в переменной которые приходят с сервера и выглядят они вот так
[[“Address”: “Саранск город,улица,Советская, д.65,п.5”,
“Monitor”: “dc-dgv-34”,
“Data”: “12-03-2017”,][
“Address”: “Ярославль город,улица,Володарского, д.101,п.78”,
“Monitor”: “tg-bur-25”,
“Data”: “24-67-2016”,]]
в первом VC : в табличке я вынимаю только адрес и получается таблица с двумя значениями адрес 1 и адрес 2, мне нужно по нажатию на первый адрес чтобы во втором vc в табличке отобразились данные monitor и data которые принадлежат их адресу , как вот такое сделать


#2

Пример абстрактный

VC1

var data: [Model] = []

prepare() {
    if segue.identifier == "Segueidentifier" {
        let vc2 = segue.destination as! VC2
        vc2.data = sender as! Model
    }
}

// tableview datasource
tableView(cellForRowAt) {
    let cell = ...
    let rowData = data[indexPath.row]

    cell.textField.text = rowData.address

    return cell
}

// tableview delegate
tableView(didSelectRowAt) {
    let rowData = data[indexPath.row]

    prepareSegue("Segueidentifier", sender: rowData)
}

VC2

var data: Model!

// tableview datasource
tableView(cellForRowAt) {
    let cell = ...

    cell.textField1.text = data.monitor
    cell.textField2.text = data.date

    return cell
}

#3

Что вы под Model понимаете?


#4

Ваша модель данных (структура, либо класс в который вы перегоняете json, либо если совсем в лоб, то [String: Any])
Посмотрите библиотеку Alamofire, как там работают с моделями, будет понятнее.


#5

Хорошо, спасибо!
посмотрю


#6

Приходит такой JSON
[
[
“MobilePhone”: “89170684000”,
“Monitor”: “null”,
“Debtor”: “Кв.0056”,
“VideoControl”: “Нет”,
“AndroidKommentariy”: "Cписать: Доводчик Е-603 (1 шт.), \n ПересортСнято: Видеодомофон цвет. PVD-405C (2 шт.), \n ",
“MasterKod”: “13022”,
“PriznakSobytiya1S”: “1”,
“ZnachenieSrochnosty”: “Обычная”,
“DatePodachiZayavki”: “2017-12-20”,
“KodServisnika”: “000004312”,
“DateOtmeny”: “0000-00-00”,
“LoginServisnika”: “null”,
“HarakterZayavki”: “Замена трубки”,
“Neispravnost”: “Трубка. Не проходит звонок в трубку. Одна квартира…”,
“KontaktTelephony”: “null”,
“MasterKod2”: “null”,
“Kvartira”: “56”,
“TimePodachiZayavki”: “13:00:00”,
“Kalitka”: “Нет”,
“FIOzayavitel”: “Абонент”,
“KodZayavki”: “167502”,
“PolnyiKod”: “11418/167502”,
“AddressKommentariy”: “null”
],
[
“MobilePhone”: “null”,
“Monitor”: “null”,
“Debtor”: “null”,
“VideoControl”: “Нет”,
“MasterKod”: “null”,
“PriznakSobytiya1S”: “1”,
“ZnachenieSrochnosty”: “Обычная”,
“DatePodachiZayavki”: “2017-10-27”,
“KodServisnika”: “000004312”,
“DateOtmeny”: “0000-00-00”,
“LoginServisnika”: “null”,
“HarakterZayavki”: “Негарантийный ремонт”,
“Neispravnost”: “Без выбора Сути заявки (подает клиент)”,
“KontaktTelephony”: “null”,
“MasterKod2”: “null”,
“Kvartira”: “0001”,
“TimePodachiZayavki”: “10:00:00”,
“Kalitka”: “Нет”,
“FIOzayavitel”: “Елена”,
“KodZayavki”: “194394”,
“PolnyiKod”: “14405/194394”,
“AddressKommentariy”: “null”
],
[
“MobilePhone”: “89170684000”,
“Monitor”: “null”,
“Debtor”: “Кв.0057”,
“VideoControl”: “Нет”,
“MasterKod”: “13022”,
“PriznakSobytiya1S”: “1”,
“ZnachenieSrochnosty”: “Обычная”,
“DatePodachiZayavki”: “2017-12-21”,
“KodServisnika”: “000004312”,
“DateOtmeny”: “0000-00-00”,
“LoginServisnika”: “null”,
“HarakterZayavki”: “Замена трубки”,
“Neispravnost”: “Трубка. Не проходит звонок в трубку. Одна квартира…”,
“KontaktTelephony”: “null”,
“MasterKod2”: “null”,
“Kvartira”: “57”,
“TimePodachiZayavki”: “13:00:00”,
“Kalitka”: “Нет”,
“FIOzayavitel”: “Абонент”,
“KodZayavki”: “167503”,
“PolnyiKod”: “11418/167503”,
“AddressKommentariy”: “null”
]
]
как сделать, чтобы вот эти данные забить в таблицу у которой название строк вот такое

let interfaceZayavok = [
        "Код заявки:",
        "Суть заявки:",
        "Характер заявки:",
        "Квартира:",
        "Адресс:",
        "Монитор:",
        "Должники:",
        "Позвонил с номера:",
        "Марка домофона:",
        "Срочность:",
        "Мастер-код 1:",
        "Мастер-код 2:",
        "Комменатрий к адресу:",
        "Контактный телефон:",
        "Мобильный телефон:",
        "Телефон для СМС:",
        "Не абоненты:",
        "Обслуживание калитки:",
        "Обслуживание ворот:",
        "Номер заказа для оплаты на сайте:",
        "Дата подачи заявки:"
    ]

причем нужны не все данные из таблицы, там несколько остается не нужных(они в дальнейшем используются) Помогите пожалуйста!


#7

у вас строки это лейблы в одной ячейке или для каждого значения своя ячейка в таблице??


#8


пока вот так вот, теперь нужно присвоить им свои значения, там получается что до этого окна есть окно с адресами, в данном случае три адреса, при нажатии на конкретный адрес, нужно в это окно вывести те значения которые принадлежат этому адресу, в самом верху посмотрите там я писал об этом


#9

не хотите сделать через title & subtitle? мне кажется не плохо бы смотрелось


#10

Для начала, у вас есть структура или класс, в который вы парсите свой json, или вы все еще работаете с Dictionary?


#11

я сделал класс, но не понимаю как json в этот класс поместить

  class Zayavki: Codable {
        let TimeVydachiVrabotu: String
        let MasterKodNew: String
        let NomerZakaza: String
        let Address: String
        let Vorota: String
        let Raion: String
        let TelephoneDlyaSMS: String
        let NeAbonenty: String
        let SutZayavki: String
        let MarkaDomofona: String
        let MobilePhone: String
        let Monitor: String
        let Debtor: String
        let MasterKod: String
        let ZnachenieSrochnosty: String
        let DatePodachiZayavki: String
        let HarakterZayavki: String
        let KontaktTelephony: String
        let MasterKod2: String
        let Kvartira: String
        let Kalitka: String
       let AddressKommentariy: String

#12

можете использовать библиотеку ObjectMapper


#13

zayv.textLabel?.text = addressZayvki[indexPath.row]["Address"]
вот так я вот могу получит в таблицу адреса, их получится три адреса, а как вынуть только конкретную информацию которая принадлежит конкретному адресу, я выше задавал этот вопрос, но может быть еще есть варианты


#14

так я же вам приводил пример кода как это сделать


#15

то есть вместо модели я могу туда своой класс вписать?


#16

получается вы должны использовать addressZayvki


#17

вот это vc, который принимает ответ json и обрабатывает его вытаскивая из ответа адресс и забивая их в таблицу

    `  import UIKit`

        class ImageViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
       @IBOutlet weak var tablezayvki: UITableView!
        var addressZayvki: [[String:String]]!


        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "NaPoleZayavok" {
                if let indexPath = self.tablezayvki.indexPathForSelectedRow {
                    let obrabotkaVC = segue.destination as! Obrabotka
                    obrabotkaVC.poleObrabotki = addressZayvki
                }
            }
        }
        
        func AddressZayvki() {
            for (index,dict) in addressZayvki.enumerated() {
                print("\(index+1) \(dict["Address", default: "not"])")
            }
        }
        
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            tableView.deselectRow(at: indexPath, animated: true)
            
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let zayv = tableView.dequeueReusableCell(withIdentifier: "Zayv", for: indexPath)
           switch seg.selectedSegmentIndex {
            case 0:
                zayv.textLabel?.text = addressZayvki[indexPath.row]["Address"]
                break
            case 1:
                zayv.textLabel?.text = MonitorString[indexPath.row]
                break
            default:
                break
                
            }
            zayv.textLabel?.numberOfLines = 0
            zayv.backgroundColor = .clear
            zayv.textLabel?.textColor = .black
            
            return zayv
            
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            var returnValue = 0
            switch seg.selectedSegmentIndex {
            case 0:
                returnValue = addressZayvki.count
            case 1:
                returnValue = MonitorString.count
            default:
                break
            }
            return returnValue
        }
     
        
        @IBOutlet weak var seg: UISegmentedControl!
         let MonitorString:[String] = ["Монитор 1" , "Монитор 2"]
        @IBAction func ValueChanged(_ sender: UISegmentedControl) {
            tablezayvki.reloadData()
        }
        
            @IBOutlet weak var ooo: UITextField!
     
       
       // var detaiImage: UITextField!
        //var modelController: UIButton!
        
        
        override func viewDidLoad() {
            super.viewDidLoad()
           
 AddressZayvki()
    }
   }
далее второй vc , в который я перехожу после нажатия на один из адресов и должен увидеть все остально связанное конкретно с этим адресом

import UIKit

class Obrabotka: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    @IBOutlet weak var tableObrabotka: UITableView!
    
    var poleObrabotki: [[String:String]]!
    
    let spisokZayvki = [
        "KodZayavki",
        "SutZayavki",
        "HarakterZayavki",
        "Kvartira",
        "Address",
        "Monitor",
        "Debtor",
        "TelephonKlienta",
        "MarkaDomofona",
        "ZnachenieSrochnosty",
        "MasterKod",
        "MasterKod2",
        "AddressKommentariy",
        "KontaktTelephony",
        "MobilePhone",
        "TelephoneDlyaSMS",
        "NeAbonenty",
        "Kalitka",
        "Vorota",
        "NomerZakaza",
        "DatePodachiZayavki",
        ]
    
    let interfaceZayavok = [
        "Код заявки:",
        "Суть заявки:",
        "Характер заявки:",
        "Квартира:",
        "Адресс:",
        "Монитор:",
        "Должники:",
        "Позвонил с номера:",
        "Марка домофона:",
        "Срочность:",
        "Мастер-код 1:",
        "Мастер-код 2:",
        "Комменатрий к адресу:",
        "Контактный телефон:",
        "Мобильный телефон:",
        "Телефон для СМС:",
        "Не абоненты:",
        "Обслуживание калитки:",
        "Обслуживание ворот:",
        "Номер заказа для оплаты на сайте:",
        "Дата подачи заявки:"
    ]
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return interfaceZayavok.count
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let obrabotkaZayavok = tableView.dequeueReusableCell(withIdentifier: "CellObr", for: indexPath) 
        
        obrabotkaZayavok.textLabel?.text = interfaceZayavok[indexPath.row] //poleObrabotki[indexPath.row]["NomerZakaza"]
        obrabotkaZayavok.textLabel?.textColor = .black
        obrabotkaZayavok.textLabel?.numberOfLines = 0
        obrabotkaZayavok.backgroundColor = .clear
        return obrabotkaZayavok
    }
    override func viewDidLoad() {
        super.viewDidLoad()
       
        print(poleObrabotki!)
    }
}

#18

obrabotkaVC.poleObrabotki = addressZayvki[indexPath.row]

а poleObrabotki должен иметь такой тип [String: String]


#19

var ppoleObrabotki: [String:String]!
?


#20

судя по вашему коду, да

P.S. установите ObjectMapper, не усложняйте себе и другим жизнь.