Множественная реализация пользовательского uitableviewcell с использованием динамических ячеек прототипа

В моем проекте используются три различных динамических прототипа tableviewcells.

Две из них являются запасными ячейками (базовыми с различными опциями), а одна-пользовательской ячейкой. И это, может измениться по мере необходимости.

Проблема, с которой я сталкиваюсь, заключается в удалении очередей из ячеек.

Если они обычно выполняются как UITableViewCells, я не могу использовать свои пользовательские выходы ячеек или действия.

let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath)

И, если они сделаны другим способом, приложение аварийно завершает работу с приведенной ниже ошибкой.

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell

Ошибка:

Could not cast value of type 'UITableViewCell' (0x38595c58) to 'AppName.SwitchTableViewCell' (0x13cdf8).

Ниже представлена реализация cellForRowAtIndexPathметода,

// MARK: - UITableViewDelegate Methods

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    // Setup a cellIdentifer string to store the cell reuse identifier you want to use for each row.
    var cellIdentifier: String

    // Switch through each row and set the appropriate cell reuse identifier
    switch sections[indexPath.section].items[indexPath.row] {
    case .AudioDevices, .Acknowledgments:
        cellIdentifier = "DisclosureCell"
    case .AllowNotifications, .ShowCloudMusic:
        cellIdentifier = "SwitchCell"
    case .Version:
        cellIdentifier = "RightDetailCell"
    }

    // Populate your cell reuse identifier into the cell

    if cellIdentifier == "SwitchCell" {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
        return cell
    }

    // Switch through each cell, and implement the labels/setup for each row
    // The order of the cases is irrelevant!
    switch sections[indexPath.section].items[indexPath.row] {
    case .AudioDevices:
        cell.textLabel?.text = "Audio Devices"
        cell.detailTextLabel?.text = String(userDefaults.integerForKey(audioDeviceListKey))
    case .AllowNotifications:
        cell.switchCellLabel?.text = "Allow Notifications"
        cell.userInteractionEnabled = false
    case .ShowCloudMusic:
        cell.switchCellLabel?.text = "Show Cloud Music"
    case .Acknowledgments:
        cell.textLabel?.text = "Acknowledgements"
        cell.detailTextLabel?.text = ""
    case .Version:
        cell.textLabel?.text = "Version"
        cell.detailTextLabel?.text = buildVersion
        cell.detailTextLabel?.textColor = UIColor.lightGrayColor()
        cell.userInteractionEnabled = false
    }
    // Return the cell
    return cell
}

Скриншот:

Изображение

2 ответа

  1. Используйте разделитель по умолчанию .

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

    func tableView cellForRowAtInd....... {
        //depends on what base you separate both cells 
        if condition = true { 
            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
            return cell
        } else {
            let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath)
           return cell
        }
    
    }
    

    Обновление на основе кодаcellForRowAtIndexPath:

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // Setup a cellIdentifer string to store the cell reuse identifier you want to use for each row.
        var cellIdentifier: String
    
        // Switch through each row and set the appropriate cell reuse identifier
        switch sections[indexPath.section].items[indexPath.row] {
        case .AudioDevices, .Acknowledgments:
            cellIdentifier = "DisclosureCell"
        case .AllowNotifications, .ShowCloudMusic:
            cellIdentifier = "SwitchCell"
        case .Version:
            cellIdentifier = "RightDetailCell"
        }
    
        // Populate your cell reuse identifier into the cell
    
        if cellIdentifier == "SwitchCell" {
            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
    
            // Switch through each cell, and implement the labels/setup for each row
            // The order of the cases is irrelevant!
            switch sections[indexPath.section].items[indexPath.row] {
            case .AudioDevices:
                cell.textLabel?.text = "Audio Devices"
                cell.detailTextLabel?.text = String(userDefaults.integerForKey(audioDeviceListKey))
            case .AllowNotifications:
                cell.switchCellLabel?.text = "Allow Notifications"
                cell.userInteractionEnabled = false
            case .ShowCloudMusic:
                cell.switchCellLabel?.text = "Show Cloud Music"
            case .Acknowledgments:
                cell.textLabel?.text = "Acknowledgements"
                cell.detailTextLabel?.text = ""
            case .Version:
                cell.textLabel?.text = "Version"
                cell.detailTextLabel?.text = buildVersion
                cell.detailTextLabel?.textColor = UIColor.lightGrayColor()
                cell.userInteractionEnabled = false
            }
            // Return the cell
            return cell
        } else {
            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
    
            // Switch through each cell, and implement the labels/setup for each row
            // The order of the cases is irrelevant!
            switch sections[indexPath.section].items[indexPath.row] {
            case .AudioDevices:
                cell.textLabel?.text = "Audio Devices"
                cell.detailTextLabel?.text = String(userDefaults.integerForKey(audioDeviceListKey))
            case .AllowNotifications:
                cell.switchCellLabel?.text = "Allow Notifications"
                cell.userInteractionEnabled = false
            case .ShowCloudMusic:
                cell.switchCellLabel?.text = "Show Cloud Music"
            case .Acknowledgments:
                cell.textLabel?.text = "Acknowledgements"
                cell.detailTextLabel?.text = ""
            case .Version:
                cell.textLabel?.text = "Version"
                cell.detailTextLabel?.text = buildVersion
                cell.detailTextLabel?.textColor = UIColor.lightGrayColor()
                cell.userInteractionEnabled = false
            }
            // Return the cell
            return cell
        }
    }
    
  2. plz использовать это

       if cellIdentifier == "SwitchCell" {
            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! SwitchTableViewCell
            return cell
        } else {
            let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
            return cell
        }
    

    доступ к метке с тегом, как это в той ячейке, где yon не определяют розетки

    if let theLabel = self.view.viewWithTag(123) as? UILabel {
            theLabel.text = "some text"
        }