Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 具有多个单元格的TableView_Swift - Fatal编程技术网

Swift 具有多个单元格的TableView

Swift 具有多个单元格的TableView,swift,Swift,我想打两个手机。只要chipnumber2不是空的,我想打电话给cellnew。但让deviceItem:Device3New=itemsNew[indexPath.row]行遇到问题。此错误:致命错误:索引超出范围。如何调用两个单元格函数?调用Cellnew时会发生此错误,但调用cell时没有问题。那么如何在Tableview中调用两个单元格函数呢 class NewMainTableViewController: UITableViewController, UITextFieldDeleg

我想打两个手机。只要chipnumber2不是空的,我想打电话给cellnew。但让deviceItem:Device3New=itemsNew[indexPath.row]行遇到问题。此错误:致命错误:索引超出范围。如何调用两个单元格函数?调用Cellnew时会发生此错误,但调用cell时没有问题。那么如何在Tableview中调用两个单元格函数呢

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

        }

    }

创建具有公共属性的协议设备

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
    }
}

您正在为两个单元使用相同的单元标识符。let cellId:String=cellId let cellIdNew:String=cellId不明白为什么要调用两次出列可重用单元-每次调用cellForRowAt`一次就足够了。Show numberOfRows方法codeI update code@rajeshkumarr仅使用一个数据源数组。NumberOfRows返回items中的项目数,但在CellForRow中,您可以从itemsNew获取项目。不要那样做。这就是崩溃的原因。我希望它总是拉数据项,但这样它只会吸引新的数据项。所以我想提取items+itemsNew数据。@stakabekor所以你想先显示itemsNew,然后显示items?@stakabekor如果itemsNew count是3,items count3,你想总共显示6行吗?是的,这正是我想要的。@stakabekor所以前3个单元格将显示Device3New,下3个单元格将显示Device3?