如何在动态UITableView xcode项目中更改单元格中的数据?

时间:2018-11-29 08:17:19

标签: ios swift uitableview

我有一个动态原型表视图,该视图具有不同的单元格,我正在将这些单元格添加到表视图中,并且我想更改其内容。我发现的所有教程都是针对只有一种类型的单元格的表格视图,但是我有8种不同的类型。我将如何更改它们的内容(例如,文本字段等),以及如何将它们的操作返回到主tableview控制器以执行一些业务逻辑? (即按下按钮等)

我所做的是:

  1. 我为每种单元格类型创建了一个服装类,并将它们连接到customClass,类字段下。

    enter image description here

  2. 我将文本字段等,动作和引用附加到这些类上。

  3. 这是我的cellAtRow函数,我想我会以某种方式更改它? 还是从这里参考课程?

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
        print ("indexPath: ", indexPath)
        print ("indexPath: ", indexPath[0])
        print ("-------")
    
        if (sectionsData[indexPath[0]] == "header") {
            let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "description") {
            let cell = tableView.dequeueReusableCell(withIdentifier: "headerInfoCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "diagnoses") {
            let cell = tableView.dequeueReusableCell(withIdentifier: "diagnosisCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "perscription") {
            let cell = tableView.dequeueReusableCell(withIdentifier: "perscriptionCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "notes") {
            let cell = tableView.dequeueReusableCell(withIdentifier: "notesCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "addFaxHeadline") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "addFaxCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "addFax") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "emailNameCell", for: indexPath)
    
            return cell
    
    
        } else if (sectionsData[indexPath[0]] == "addEmailHeadline") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "addEmailCell", for: indexPath)
    
            return cell
    
    
        } else if (sectionsData[indexPath[0]] == "addEmails") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "emailNameCell", for: indexPath)
    
            return cell
    
    
        } else if (sectionsData[indexPath[0]] == "givePermissionHeadline") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "permissionCell", for: indexPath)
    
            return cell
    
        } else if (sectionsData[indexPath[0]] == "select answer") {
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "selectAnswerCell", for: indexPath)
    
            return cell
        }
    

4 个答案:

答案 0 :(得分:3)

您需要使用

let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as! HeaderTableViewCell

例如呼叫cell.yourTextField.text

答案 1 :(得分:1)

您必须将单元格强制转换为它们所属的类。在代码块的第二行,您可以看到一个示例。

if (sectionsData[indexPath[0]] == "header") {
    let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell", for: indexPath) as! HeaderTableViewCell

    cell.titleLbl.text = "Title"
    cell.delegate = self // To receive actions back

    return cell
}

. . . // More of the same

// default return

要将呼叫发送回主视图控制器,您可以像这样向您的单元中添加协议:

protocol HeadTableViewCellProcol{
    func bttnPressed()
}

class HeadTableViewCell: UITableViewCell{

    var delegate: HeadTableViewCellProcol?

    @IBAction func bttnPressedInCell(){
        delegate?.bttnPressed()
    }
}

此协议的此协议类似于您必须为UITableView实现的协议。您还必须在主VC中实现这些协议。

答案 2 :(得分:0)

您需要将UITableViewCell转换为动态单元格类。您可以尝试以下操作:

guard let cell = tableView. dequeueReusableCell(withIdentifier: "perscription", for: indexPath) as? PerscriptionTableViewCell else { return UITableViewCell() }

cell.setupCell() //You have access to cell's public funcs and vars now
return cell

使用可选的展开功能,可以确保您的应用很可能免受类型转换崩溃的影响。

答案 3 :(得分:0)

正如Apple documentation所说, dequeueReusableCell 的返回类型是 UITableViewCell

DECLARE @dbName nvarchar(MAX) ='' DECLARE @sql nvarchar(MAX) = '' DECLARE @sql2 nvarchar(MAX) = '' DECLARE @sql3 nvarchar(MAX) = '' DECLARE Crs CURSOR LOCAL FOR SELECT d.name FROM sys.databases d INNER JOIN sys.dm_database_encryption_keys e ON d.database_id = e.database_id where d.name not like 'tempdb' OPEN Crs FETCH NEXT FROM Crs into @dbName WHILE @@FETCH_STATUS = 0 BEGIN SET @sql= 'use ' + @dbName + ' ALTER DATABASE ' + @dbName + ' SET ENCRYPTION OFF' select @sql SET @sql2='BACKUP DATABASE ' + @dbName + ' TO DISK = ''J:\Backup\' + @dbName + '_full.bak'' WITH NOFORMAT, COPY_ONLY, NOINIT, NAME = ''J:\'+ @dbName + ''', SKIP, NOREWIND, NOUNLOAD, STATS = 10' select @sql2 SET @sql3= 'use ' + @dbName + ' ALTER DATABASE ' + @dbName + ' SET ENCRYPTION ON' select @sql3 FETCH NEXT FROM Crs into @dbName END CLOSE Crs DEALLOCATE Crs

您的自定义单元格类应该继承自UITableViewCell,并且要能够使用自定义单元格的实例,您需要将返回的dequeReusableCell的UITableViewCell转换为所需的自定义单元格类型。

Apple Documentation Return Value: A UITableViewCell object with the associated identifier or nil if no such object exists in the reusable-cell queue.

对于自定义,每个单元负责自己的配置。您应该有一个函数(可以使用协议或从超类继承),并在cellForRowAtIndexPath内部,对它进行强制转换后,调用setup函数。

let cell = tableView.dequeueReusableCell(withIdentifier: "customCellIdentifierCell", for: indexPath) as! YourCutsomTableViewCell