gpt4 book ai didi

ios - 如何制作包含 UILabel 的可重用 UIView 模板

转载 作者:行者123 更新时间:2023-11-28 05:33:17 24 4
gpt4 key购买 nike

我正在构建一个天气应用程序作为初学者项目。假设我想要一个包含许多 UILabels 的自定义 View ,用于温度、湿度、降水等。这个想法是这个自定义 UIView 将针对用户保存的每个城市多次使用。如果用户保存了 3 个城市,则自定义 View 将有 3 个实例。

最好的方法是什么?我正在尝试子类化 UIView。最初我正在覆盖 drawRect(rect: CGRect) 并在那里定义我的 UILabels。那只是感觉不对。在我尝试更新 NSURLSession 上的完成处理程序中的标签文本之后,直到稍后它才会被分配/初始化。

或者我应该覆盖让我这样做的 init() :

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

我不知道那是什么意思。然后,当我尝试在根 VC 上使用框架初始化时,我不得不做这样的事情。

override init(frame: CGRect) { super.init(frame: frame) }

谁能告诉我最好的方法?我有类似下面的内容,但是当我尝试将 UILabel 添加到自定义类的 subview 时,我得到了一个 nil 值。

class ViewTemplate: UIView {

var tempLabel: UILabel!
var humidityLabel: UILabel!

override init () {

tempLabel = UILabel()
tempLabel.frame = CGRectMake(halfScreenWidth - 130, 120, 260, 130)
tempLabel.textColor = UIColor.whiteColor()
tempLabel.backgroundColor = UIColor.clearColor()

// similar stuff for humidityLabel

super.init()
addSubview(tempLabel)

}

override init(frame: CGRect) { super.init(frame: frame) }

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

如果不太确定 nil 是从哪里来的。但最重要的是,我正在寻找这样做的最佳实践。谢谢!

最佳答案

用于创建个人 View :

  1. 创建新的 View 文件。 UIView 的子类。确保在执行此操作时还创建了 xib 文件。
  2. 在 Storyboard中绘制您的项目(标签等)并将它们连接到 swift 文件
  3. 通过将 xib 文件设为您刚创建的 swift 文件的自定义类,确保在 Storyboard中连接它们。
  4. 在 awakeFromNib() 方法中实例化它们。 如果是标签,请确保为文本设置默认值。否则它们在实例化时将显示为 nil,您的应用将崩溃。

    导入 UIKit

    MyView 类:UIView {

    @IBOutlet weak var templabel: UILabel!

    覆盖函数 awakeFromNib() { super.awakeFromNib() self.tempLabel.text = "95度"

加载到 View Controller :

1a.创建一个实现 UIScrollView 的 View Controller 。1b.在 Storyboard中放置一个 UIScrollview 并将其连接到该 View Controller

class MyWeatherViewController: UIViewController, UIScrollViewDelegate {

@IBOutlet var scrollView: UIScrollView!

2a。在 ViewDidLoad 中,创建您要创建的 UIView 的实例。单独填充它们。2b.在ViewDidLoad中,设置scrollview的宽度为单个View的宽度。设置高度为单个View的高度*你要显示的View个数

       var view1: MyView = MyView()
var view2: MyView = MyView()
let viewArray[MyView!] = [view1, view2]

for items in viewArray {
var frame = scrollView.bounds

//Set the origin of the views
frame.origin.x = 0.0
frame.origin.y = frame.size.height * items

//create a view out of the object provided, define it's frame, and add to scrollview
let viewToAdd = viewArray[items].view
newPageView.frame = frame
scrollView.addSubview(viewToAdd)

//设置要显示的标签。您必须在将负载加载到 ScrollView 后执行此操作 viewArray[items].tempLabel.text = "105 度"

请记住,您需要设置另一个数据模型来保存要显示的信息。我建议创建一个数组来保存您希望显示的信息,这样您就可以使用您希望设置的所有标签执行 viewArray[items].tempLabel.text = tempArray[items]。

这应该使它们垂直对齐并能够滚动并查看所有项目。

这还将允许根据用户保存的城市动态决定添加多少 View 。只需修改逻辑以读取用户拥有的许多城市等。

关于ios - 如何制作包含 UILabel 的可重用 UIView 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26521874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com