TableView с несколькими ячейками Swift - PullRequest
0 голосов
/ 16 мая 2019

Я хотел бы назвать две ячейки. до тех пор, пока chipnumber2 не пуст, я бы хотел позвонить на cellnew. Но в строке "let deviceItem: Device3New = itemsNew [indexPath.row]" возникли проблемы. Эта ошибка: фатальная ошибка: индекс выходит за пределы допустимого диапазона. Как мне вызвать две функции ячейки? Эта ошибка возникает при вызове Cellnew, но при вызове cell нет проблем. Итак, как мне вызвать две функции ячеек в табличном представлении?

class NewMainTableViewController: UITableViewController, UITextFieldDelegate, MiniTabBarDelegate, NVActivityIndicatorViewable {
    var items: [Device3] = []
        var itemsNew: [Device3New] = []

        let cellId: String = "cellId"

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(DeviceTableViewCell2.self, forCellReuseIdentifier: cellId)

     }

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return items.count
        }

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! DeviceTableViewCell2

            if((chipnumber2.text?.isEmpty) != true) {

                let cellNew = tableView.dequeueReusableCell(withIdentifier: cellIdNew, for: indexPath) as! DeviceTableViewCell2

                let deviceItem: Device3New = itemsNew[indexPath.row]

                cellNew.badgeColor = UIColor.flatLime
                cellNew.badgeTextColor = .white;
                cellNew.badgeFontSize = 13;
                cellNew.badgeString = deviceItem.time
                cellNew.badgeOffset = CGPoint(x:30.0, y:63)

                cellNew.deviceItem3New = deviceItem
                cellNew.titleNew.text = deviceItem.title
                cellNew.title1New.text = deviceItem.places
                cellNew.titlesaatNew.text = deviceItem.time
                cellNew.buttonNew.isOn = deviceItem.state

                cellNew.tablerow = String (indexPath.row)

                cellNew.backgroundColor = UIColor(white: 1, alpha: 0.09)

                return cellNew


            }

            if((chipnumber.text?.isEmpty) != true) {

            let deviceItem: Device3 = items[indexPath.row]

            cell.badgeColor = UIColor.flatLime
            cell.badgeTextColor = .white;
            cell.badgeFontSize = 13;
            cell.badgeString = deviceItem.time
            cell.badgeOffset = CGPoint(x:30.0, y:63)

            cell.deviceItem3 = deviceItem
            cell.title.text = deviceItem.title
            cell.title1.text = deviceItem.places
            cell.titlesaat.text = deviceItem.time
            cell.button.isOn = deviceItem.state

            cell.tablerow = String (indexPath.row)


            cell.backgroundColor = UIColor(white: 1, alpha: 0.09)

                return cell

            }
            return cell

        }

    }

1 Ответ

1 голос
/ 16 мая 2019

Создать протокол Устройство с общими свойствами

protocol Device {
    //common properties of both struct
    var time: String { get }
    var title: String { get }
    var places: String { get }
    var state: String { get }
}

Подтвердите этот прокол в обеих структурах и добавьте общие свойства, если вам нужно

struct Device3New: Device {
    var time: String
    var title: String
    var places: String
    var state: String
    //other properties
    var myVar1: String
}
struct Device3: Device {
    var time: String
    var title: String
    var places: String
    var state: String
    //other properties
    var myVar2: String
}

Создать общий массив с типом протокола выше

Теперь в методе numberOfRowsInSection проверьте chipnumber2.text!.isEmpty и chipnumber.text!.isEmpty и добавьте массивы в общий массив. А в cellForRowAt получить объект из общего массива.

class NewMainTableViewController: UITableViewController {
    var items: [Device3] = []
    var itemsNew: [Device3New] = []
    var joinedItems: [Device] = []
    //chipnumber, chipnumber2 textfields
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        joinedItems.removeAll()
        if !chipnumber2.text!.isEmpty {
            joinedItems.append(contentsOf: itemsNew)
        } else if !chipnumber.text!.isEmpty {
            joinedItems.append(contentsOf: items)
        }
        return joinedItems.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellNew = tableView.dequeueReusableCell(withIdentifier: "cellIdNew", for: indexPath) as! DeviceTableViewCell2

        let deviceItem: Device = joinedItems[indexPath.row]
        //common properties
        print(deviceItem.time)
        print(deviceItem.title)
        print(deviceItem.places)
        print(deviceItem.state)
        //other properties
        if let deviceItem = joinedItems[indexPath.row] as? Device3New {
            print(deviceItem.myVar1)
        } else if let deviceItem = joinedItems[indexPath.row] as? Device3 {
            print(deviceItem.myVar2)
        }
        return cellNew
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...