ios – Swift – 如何创建自定义viewForHeaderInSection,使用XIB文件?

我可以通过如下编程方式创建简单的自定义viewForHeaderInSection.但是我想要做更复杂的事情,也许与不同的类连接,并且像tableView单元格一样实现它们的属性.简单来说,我想看看我做了什么.
func tableView(tableView: UITableView,viewForHeaderInSection section: Int) -> UIView? {

    if(section == 0) {

        let view = UIView() // The width will be the same as the cell,and the height should be set in tableView:heightForRowAtIndexPath:
        let label = UILabel()
        let button   = UIButton(type: UIButtonType.System)

        label.text="My Details"
        button.setTitle("Test Title",forState: .Normal)
        // button.addTarget(self,action: Selector("visibleRow:"),forControlEvents:.TouchUpInside)

        view.addSubview(label)
        view.addSubview(button)

        label.translatesAutoresizingMaskIntoConstraints = false
        button.translatesAutoresizingMaskIntoConstraints = false

        let views = ["label": label,"button": button,"view": view]

        let horizontallayoutContraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[label]-60-[button]-10-|",options: .AlignAllCenterY,metrics: nil,views: views)
        view.addConstraints(horizontallayoutContraints)

        let verticalLayoutContraint = NSLayoutConstraint(item: label,attribute: .CenterY,relatedBy: .Equal,toItem: view,multiplier: 1,constant: 0)
        view.addConstraint(verticalLayoutContraint)

        return view
    }

    return nil
}


func tableView(tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
    return 50
}

有没有人可以解释如何使用xib创建自定义tableView标题视图?我遇到了旧的Obj-C主题,但我是Swift语言的新功能.如果有人详细解释,会很棒.

1.issue: Button @IBAction doesn’t connect with my ViewController. (Fixed)

解决与文件的所有者,ViewController基类(点击左侧轮廓菜单.)

2.issue: Header height problem (Fixed)

解决在viewForHeaderInSection:方法中添加headerView.clipsToBounds = true.

对于约束警告this answer solved my problems

当在ViewController中使用此方法添加ImageView时,甚至使用相同的高度约束,它将流过tableView行look like picture.

func tableView(tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
    return 120
}

如果我使用,在viewDidLoad中自动调整ScrollViewInsets,在这种情况下,图像在导航栏下流动. -固定-

self.automaticallyAdjustsScrollViewInsets = false

3.issue: If button under View (Fixed)

@IBAction func didTapButton(sender: AnyObject) {
    print("tapped")

    if let upView = sender.superview {
        if let headerView = upView?.superview as? CustomHeader {
            print("in section \(headerView.sectionNumber)")
        }

    }
}

解决方法

基于NIB的标头的典型过程是:

>创建UITableViewHeaderFooterView子类,至少有一个标签的插座.您可能还想给它一些标识符,您可以通过该标识符反向工程到该标题对应的部分.同样,您可能需要指定一个协议,通过该协议,头可以通知视图控制器的事件(例如敲击按钮).因此,在Swift 3中:

// if you want your header to be able to inform view controller of key events,create protocol

protocol CustomHeaderDelegate: class {
    func didTapButton(in section: Int)
}

// define CustomHeader class with necessary `delegate`,`@IBOutlet` and `@IBAction`:

class CustomHeader: UITableViewHeaderFooterView {
    weak var delegate: CustomHeaderDelegate?

    @IBOutlet weak var customLabel: UILabel!

    var sectionNumber: Int!  // you don't have to do this,but it can be useful to have reference back to the section number so that when you tap on a button,you know which section you came from

    @IBAction func didTapButton(_ sender: AnyObject) {
        delegate?.didTapButton(in: sectionNumber)
    }

}

>创建NIB.就个人而言,我给NIB与基类名称相同,以简化我的项目文件的管理,避免混淆.无论如何,关键步骤包括:

>创建视图NIB,或者如果您启动了一个空的NIB,则将视图添加到NIB;
>将视图的基类设置为您的UITableViewHeaderFooterView子类(在我的示例中为CustomHeader);
>在IB中添加您的控制和限制;
钩住@IBOutlet引用Swift代码的插座;
>将按钮连接到@IBAction

>在视图控制器中的viewDidLoad中注册NIB.在Swift 3:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.register(UINib(nibName: "CustomHeader",bundle: nil),forHeaderFooterViewReuseIdentifier: "CustomHeader")
}

或在Swift 2:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.registerNib(UINib(nibName: "CustomHeader",forHeaderFooterViewReuseIdentifier: "CustomHeader")
}

>在viewForHeaderInSection中,使用与上一步中指定的相同标识符对可重用的视图进行排队.完成后,您现在可以使用您的插座,您无需对编程创建的约束等做任何事情.唯一认为您需要做的(为按钮工作的协议)是指定其委托.例如,在Swift 3中:

override func tableView(_ tableView: UITableView,viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeader") as! CustomHeader

    headerView.customLabel.text = content[section].name  // set this however is appropriate for your app's model
    headerView.sectionNumber = section
    headerView.delegate = self

    return headerView
}

override func tableView(_ tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
    return 44  // or whatever
}

或者,在Swift 2:

override func tableView(tableView: UITableView,viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterViewWithIdentifier("CustomHeader") as! CustomHeader

    headerView.customLabel.text = content[section].name
    headerView.sectionNumber = section
    headerView.delegate = self

    return headerView
}

override func tableView(tableView: UITableView,heightForHeaderInSection section: Int) -> CGFloat {
    return 44  // or whatever
}

>显然,如果要将视图控制器指定为标题视图中按钮的代理,则必须符合该协议:

extension ViewController: CustomHeaderDelegate {
    func didTapButton(in section: Int) {
        print("\(section)")
    }
}

当我列出所有涉及的步骤时,这听起来很混乱,但一旦你完成了一两次,这真的很简单.我认为这比通过编程方式构建标题更简单.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple 最新软件的错误和性能问题。
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只有5%的概率会遇到选择运营商界面且部分必须连接到iTunes才可以激活
一般在接外包的时候, 通常第三方需要安装你的app进行测试(这时候你的app肯定是还没传到app store之前)。
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应用变灰了。那么接下来我们看一下Flutter是如何实现的。Flutter中实现整个App变为灰色在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下:ColorFiltered(颜色过滤器)看名字就知道是增加颜色滤镜效果的,ColorFiltered( colorFilter:ColorFilter.mode(Colors.grey, BlendMode.
flutter升级/版本切换
(1)在C++11标准时,open函数的文件路径可以传char指针也可以传string指针,而在C++98标准,open函数的文件路径只能传char指针;(2)open函数的第二个参数是打开文件的模式,从函数定义可以看出,如果调用open函数时省略mode模式参数,则默认按照可读可写(ios_base:in | ios_base::out)的方式打开;(3)打开文件时的mode的模式是从内存的角度来定义的,比如:in表示可读,就是从文件读数据往内存读写;out表示可写,就是把内存数据写到文件中;
文章目录方法一:分别将图片和文字置灰UIImage转成灰度图UIColor转成灰度颜色方法二:给App整体添加灰色滤镜参考App页面置灰,本质是将彩色图像转换为灰度图像,本文提供两种方法实现,一种是App整体置灰,一种是单个页面置灰,可结合具体的业务场景使用。方法一:分别将图片和文字置灰一般情况下,App页面的颜色深度是24bit,也就是RGB各8bit;如果算上Alpha通道的话就是32bit,RGBA(或者ARGB)各8bit。灰度图像的颜色深度是8bit,这8bit表示的颜色不是彩色,而是256
领导让调研下黑(灰)白化实现方案,自己调研了两天,根据网上资料,做下记录只是学习过程中的记录,还是写作者牛逼
让学前端不再害怕英语单词(二),通过本文,可以对css,js和es6的单词进行了在逻辑上和联想上的记忆,让初学者更快的上手前端代码
用Python送你一颗跳动的爱心
在uni-app项目中实现人脸识别,既使用uni-app中的live-pusher开启摄像头,创建直播推流。通过快照截取和压缩图片,以base64格式发往后端。
商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。),验证通过打开选择支付方式弹窗页面,选择微信支付或者支付宝支付;4.可取消支付,放弃支付会返回会员页面,页面提示支付取消;2.判断支付方式,如果是1,则是微信支付方式。1.判断是否在微信内支付,需要在微信外支付。
Mac命令行修改ipa并重新签名打包
首先在 iOS 设备中打开开发者模式。位于:设置 - 隐私&安全 - 开发者模式(需重启)
一 现象导入MBProgressHUD显示信息时,出现如下异常现象Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in ViewController.old: symbol(s) not found for architecture x86_64clang: error: linker command failed wit
Profiles >> 加号添加 >> Distribution >> "App Store" >> 选择 2.1 创建的App ID >> 选择绑定 2.3 的发布证书(.cer)>> 输入描述文件名称 >> Generate 生成描述文件 >> Download。Certificates >> 加号添加 >> "App Store and Ad Hoc" >> “Choose File...” >> 选择上一步生成的证书请求文件 >> Continue >> Download。
今天有需求,要实现的功能大致如下:在安卓和ios端实现分享功能可以分享链接,图片,文字,视频,文件,等欢迎大佬多多来给萌新指正,欢迎大家来共同探讨。如果各位看官觉得文章有点点帮助,跪求各位给点个“一键三连”,谢啦~声明:本博文章若非特殊注明皆为原创原文链接。