在Swift中将String内容转换为UITableViewCell类型

时间:2017-05-19 05:37:20

标签: ios swift string

您可以通过特定功能将Swift 3 String的内容转换为类型吗?我将举一个例子:

我已经声明了多个UITableViewCell类,如下所示:

class ScrollFeedCell : UITableViewCell {...}
class AdCell : UITableViewCell {...}
class MovieCell : UITableViewCell {...}

我想在视图控制器中声明转换函数,如下所示:

func convert(String) -> Any {}

然后我想使用以下内容:

class TableView : UITableViewController {
let typeArray = [String] 

override func viewDidLoad() {
//add a huge ton of strings into the typeArray
} 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = UITableViewCell()
    let c = typeArray[indexPath.section]

    if  c == "ScrollFeddCell" || c == "AdCell" || c == "MovieCell" {
        cell = tableView.dequeueReusableCell(withIdentifier: content[indexPath.section], for: indexPath) as! convert(c)
    } else { 
    cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
   }

    return cell
} 
}

3 个答案:

答案 0 :(得分:3)

我不认为这是可能的。即使它在某种程度上是可能的,我认为这将涉及许多肮脏的伎俩,在这种情况下并不值得。

事实上,您使用虚构convert方法的唯一地方就是:

cell = tableView.dequeueReusableCell(withIdentifier:       
    content[indexPath.section], for: indexPath) as! convert(c)
                                                    ^^^^^^^^^^

为什么要将其转换为正确的类型?由于这是非常动态的,编译器无法知道convert返回的类型的成员。基本上,太有活力了。在这里将它强制转换为正确的类型是没有用的。

封闭方法无论如何都会返回UITableViewCell,因此您可以在没有编译器抱怨的情况下返回dequeueResuableCell的返回值。

“但我希望在将它出列后将其配置为......”你可能会说。

那么,您将以与ScrollFeedCell不同的方式配置MovieCell,对吧?因此,您不能只在此行之后编写所有配置代码:

cell = tableView.dequeueReusableCell(withIdentifier:       
    content[indexPath.section], for: indexPath) as! convert(c)

您仍然需要编写if语句并检查该单元格是MovieCellScrollFeedCell还是AdCell。那么为什么不删除上面的行而是这样做:

if c == "ScrollFeedCell" {
    let scrollFeedCell = tableView.dequeueReusableCell(withIdentifier:       
        content[indexPath.section], for: indexPath) as! ScrollFeedCell
    // configure cell here
    cell = scrollFeedCell
} else if c == "AdCell" {
    let adCell = tableView.dequeueReusableCell(withIdentifier:       
        content[indexPath.section], for: indexPath) as! AdCell
    // configure cell here
    cell = adCell
} else if c == "MovieCell" {
    let movieCell = tableView.dequeueReusableCell(withIdentifier:       
        content[indexPath.section], for: indexPath) as! MovieCell
    // configure cell here
    cell = movieCell
} else {
    cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
}

编辑:

试试这个:

if c == "ScrollFeedCell" {
    let scrollFeedCell = tableView.dequeueReusableCell(withIdentifier:       
        content[indexPath.section], for: indexPath) as! ScrollFeedCell
    scrollFeedCell.delegate = self
    cell = scrollFeedCell
} else if c == "AdCell" || c == "MovieCell" { // add your other cell types here.
    cell = tableView.dequeueReusableCell(withIdentifier:       
        content[indexPath.section], for: indexPath)
} else {
    cell = tableView.dequeueReusableCell(withIdentifier: "CategoryScrollFeed_Cell", for: indexPath)
}

答案 1 :(得分:0)

请考虑您要做的事情是否必要。为什么要将它们转换为特定的细胞类型?只需将单元格保存为UITableViewCell并将其返回即可。如果您对不同的单元格有特定的操作,则应将if个案分开:

if c == "ScrollFeddCell" {
     cell = tableView.dequeueReusableCell(withIdentifier: c, for: indexPath) as! ScrollFeddCell
     //cell.doSomethingForScorll()
}
else {
     cell = tableView.dequeueReusableCell(withIdentifier: c, for: indexPath) 
     //do nothing for common cells.
}

//....

答案 2 :(得分:0)

有点晚了,但是对于那些寻找答案的人来说

我知道您想要什么,我同意您的需要。 在我的情况下,我需要这样做,因为在我的应用程序中,我不仅从服务器接收数据,而且还要在单元内布置此类数据的布局。到目前为止,我还没有找到解决方案。就您而言,这似乎容易一些:

// 1. Create a protocol with the configuring method
    protocol configureCellProtocol
    {
    func configure(cell:MyData)
    }
// 2. Add this protocol to the 8 classes derived from UITableViewCell that define your cells
// 3. Cast the reusable cell to this protocol: (note that you have to do a double cast,
//    both to configureCellProtocol and UITableViewCell, (that's what the & is for) otherwise, 
//    you won't be able to return the configured cell
    let thisCell=tableView.dequeReusableCell(
        withReuseIdentifier: cellClass, for: indexPath) as! UITableViewCell & configureCellProtocol
// 4. then you can call the method like this:
    thisCell.configure(cell:configurationData)
// which in turn will call the specific method in each class. Then you have to define the configure
// method in each class, otherwise you'll get a crash at runtime. Do what you need to configure
// your cells in each class in this method
//

在步骤3中,cellClass是一个String,这又是您注册的类名称。对于您而言,您必须根据使每个单元格不同的条件从数组中选择它