Swift:UIView 出现在 UITableView 单元格中

Posted

技术标签:

【中文标题】Swift:UIView 出现在 UITableView 单元格中【英文标题】:Swift: UIView appear in UITableView cell 【发布时间】:2016-01-28 07:41:20 【问题描述】:

我在将我创建的 UIView 放入特定 UITableView 单元格时遇到问题。这是我的代码:

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 

//MARK : Properties
var tableView = UITableView()
var items: [String] = ["Age", "Gender", "Smoking Hx", "Occup. -Ag", "Family Hx", "Chronic Lung Disease Radiology", "Chronic Lung Disease Hx", "Nodule Border", "Nodule Location", "Satellite Lesions", "Nodule Pattern Cavity", "Nodule Size"]
var navigationBar = NavigationBar()
var gender = GenderView()
var maleIcon = MaleIconView()

override func viewDidLoad() 
    super.viewDidLoad()

    //Create TableView
    tableView.frame = CGRectMake(0, self.view.bounds.height * 0.097, self.view.bounds.width,
        self.view.bounds.height - self.view.bounds.height * 0.097);
    tableView.delegate = self
    tableView.dataSource = self
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    self.view.addSubview(tableView)



    //Create Navigation Bar with custom class
    self.navigationBar = NavigationBar(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height * 0.097))
    self.view.addSubview(navigationBar)





override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.





func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return self.items.count



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell

    cell.textLabel?.text = self.items[indexPath.row]

    //Cell wont turn grey when selected
    cell.selectionStyle = UITableViewCellSelectionStyle.None

    //Want to add UIView male Icon in first row
    if(indexPath.row == 0)
        maleIcon = MaleIconView(frame: CGRect(x: 0, y: 0, width: 55, height: 55))
        maleIcon.center.x = cell.center.x + cell.center.x * 0.5
        maleIcon.center.y = cell.contentView.center.y
        maleIcon.layer.cornerRadius = 0.5 * maleIcon.bounds.size.width
        //maleIcon.layer.borderWidth = 3.0
        cell.addSubview(maleIcon)
    


    return cell



func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

 return self.view.bounds.height * 0.15



func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    print("You selected cell #\(indexPath.row)!")



也许问题存在于 MaleIconView() 中?这是代码:

class MaleIconView: UIView 

var maleView = UIView()

override init(frame: CGRect) 
    super.init(frame: frame)
    self.frame = frame
    setUpView()


func setUpView()

    maleView.frame = CGRectMake(0, 0, self.bounds.width, self.bounds.height)
    maleView.alpha = 1
    maleView.backgroundColor = UIColor.blackColor()
    maleView.layer.cornerRadius = 0.5 * maleView.bounds.size.width
    self.addSubview(maleView)





func hide()
    self.removeFromSuperview()


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")



我试图让 UIView 出现在单元格 0 的右侧。还有 indexPath 全部关闭的问题,我认为这可能是 UIView 出现在多个单元格中的一些问题。提前谢谢!

【问题讨论】:

试试 cell.contentView.addSubview(maleIcon) @DavidWilliames 不,这似乎不起作用,它产生了相同的结果。我相信我的 IndexPath.row 有问题,因为当我打印它时,即使它是第 12 行,最后一行也会吐出“5”。但我觉得我的编程是标准的,我没有做任何真正不同的事情。 @DavidWilliames UIView 目前正在出现,它只是出现在多行中,有时会重新出现在自身之上。 哦,对了。那是因为你永远不会从视图/单元格中删除它,所以当带有图标的单元格被出列和重用时,它会继续出现在单元格位于第 0 行某一点的每个实例中。这有意义吗?跨度> 另一个快速观察是,您似乎正在根据“项目”数组中的值创建一个带有静态单元格的表格视图。也许看看这个 repo github.com/venmo/Static 它对静态表视图非常有用。 :) 【参考方案1】:

以下是可以帮助您解决问题的代码。我对您可能如何尝试实施做了一些假设。但这对你来说应该是一个很好的开始。

https://www.dropbox.com/sh/2ilyfnc1pqurjfd/AAC2rU-zlvUtjdKYV33JrQJQa?dl=0

我还强烈建议您对各种视图尺寸使用自动布局,而不是硬编码奇怪的偏移量。开始可能很困难。但从长远来看,它肯定会有所回报!

【讨论】:

嘿大卫,我实际上遇到了一个小问题。应用程序在此处崩溃:“cell = tableView.dequeueReusableCellWithIdentifier("cell") as!CustomTableViewCell”。它说:“无法将'UITableViewCell'(0x10d214128)类型的值转换为'UCSF_Lung_Nodules.CustomTableViewCell'”。我相信这是因为我以编程方式进行操作,而您使用情节提要完成了操作。你介意给我发电子邮件或聊天吗?到目前为止,您已经帮了很多忙,我很感激,但我需要在星期五之前完成这项工作!!【参考方案2】:

maleIcon 是您代码中的 UIViewController 属性,这有点奇怪。

您是否尝试输入cellForRowAtIndexPath

这样:

//Want to add UIView male Icon in first row
    if(indexPath.row == 0)
        let maleIcon = MaleIconView(frame: CGRect(x: 0, y: 0, width: 55, height: 55))

我不确定它是否对可重复使用的细胞有所帮助。什么会有所帮助(但还有更多的工作)是创建自己的单元格类,添加maleIcon 作为属性,在您的表中注册该类并将其放入您的cellForRowAtIndexPath 中:

if (indexPath.row == 0) 
    cell.maleIcon.hidden = false
       else 
    cell.maleIcon.hidden = true

【讨论】:

@OriginalAlchemist 在仔细查看您的代码之后,我认为最好的方法是创建您自己的单元类,如此处所述。如果您计划为每个单元格使用类似的布局,即每个单元格的图标,请创建自己的 IconTableViewCell 类或其他东西。然后,您可以将自定义单元格的图标设置为“男性”或“其他”或“无”,而不是将 MaleIcon 添加到视图中。 是的,这是我从一开始就计划好的,但由于某种原因它不起作用。我正在考虑创建一个单元类,但这不是问题。问题是我的 indexPath 已关闭。我在命令行中打印出数字并且它关闭了。最后一行是 indexPath 编号 5,即使它是第 12 行。如果我能解决这个问题,一切都会好起来的!!但我把头撞在墙上,想弄清楚为什么不是!我知道这很麻烦,但是如果您将我的代码完全复制到一个新项目中,您有望解决。请!我哭了!! @大卫威廉姆斯 真正的问题是 UIView 出现了两次,因为 indexpath 已关闭,有时当我向下滚动然后返回时,它会再次出现。但是 UIView 确实出现在正确的单元格中。 @大卫威廉姆斯 @OriginalAlchemist 我将您的代码复制到一个新项目中。 indexPath 最多只能打印 5 行的原因是因为一次在屏幕上只能看到 5 行。当您向下滚动时,应该打印其他 indexPaths。 UITableView 的工作方式是回收单元格。因此,一旦第一个单元格离开屏幕,它会将其替换为底部以滚动为新的底部单元格,而不是初始化一个新的 UITableViewCell。这就是dequeueReusableCellWithIdentifier 方法正在做的事情。在运行时,只有 5 个单元格会被初始化,因为只有 5 个是可见的 @OriginalAlchemist 阅读有关 UITableViewCells 的 Apple 文档,以更好地理解我的意思以及它们的工作原理。 developer.apple.com/library/ios/documentation/UserExperience/…

以上是关于Swift:UIView 出现在 UITableView 单元格中的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 呈现 UIView(不是 ViewController)

UIView中的UITableView与swift

使用 Swift 4 和 UIView 的奇怪动画行为

GradientLayer 中的 Swift -Animation 未出现在单元格中

SWIFT:用键盘向上移动的UIView,在初始移动后移动非常奇怪,不会回落

在 Swift 运行时更改自动布局约束的 UIView 的框架