我按照本教程创建了一个自定义。xib,我计划在表格视图的单元格中使用它:
https://medium.com/@brianclouser/swift-3-creating-a-custom-view-from-a-xib-ecdfe5b3a960
以下是我创建的 .xib 类:
class UserView: UIView {
@IBOutlet var view: UIView!
@IBOutlet weak var username: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
private func initialize() {
Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
addSubview(view)
view.frame = self.bounds
view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
}
以前,我在情节提要中创建我的表视图单元格,但我已经意识到我想要一个更灵活的视图,以便我可以在应用的不同部分使用它,所以我创建了上面的自定义.xib,UserView
。
我已将序列图像板中的表视图单元格更新为使用自定义 .xib:
https://i.stack.imgur.com/t7Tr7.png
下面是我的表格视图控制器类在创建自定义之前的样子。xib(即制作故事板中的布局):
class UserTableViewController: UITableViewController {
// MARK: Properties
let provider = MoyaProvider<ApiService>()
var users = [User]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 100
tableView.rowHeight = UITableViewAutomaticDimension
// Fetch the user by their username
provider.request(.getUsers()) { result in
switch result {
case let .success(response):
do {
let results = try JSONDecoder().decode(Pagination<[User]>.self, from: response.data)
self.users.append(contentsOf: results.data)
self.tableView.reloadData()
} catch {
print(error)
}
case let .failure(error):
print(error)
break
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "UserTableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? UserTableViewCell else {
fatalError("The dequeued cell is not an instance of UserTableViewCell.")
}
let user = users[indexPath.row]
cell.username.text = user.username
return cell
}
}
下面是表格视图单元格类:
class UserTableViewCell: UITableViewCell {
//MARK: Properties
@IBOutlet weak var userView: UserView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
我的问题是,如何更新上面的表视图控制器类以使用我的自定义. xib,而不是使用故事板布局?
您可以使用两种方式:
创建UITableViewCell(更好)
1) 将UIView更改为UITableViewCell
class CustomTableViewCell: UITableViewCell {
...
class var identifier: String {
return String(describing: self)
}
}
2)注册您的细胞
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerNib(UINib(nibName: CustomTableViewCell.identifier, bundle: nil), forCellReuseIdentifier: CustomTableViewCell.identifier)
...
}
3)使用cellForRow(at:)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.identifier) as! CustomTableViewCell
cell.username.text = user.username
return cell
}
或将视图作为子视图添加到单元格(仅在极少数情况下)
1) 将其添加到用户视图
class UserView: UIView {
...
class func fromNib() -> UserView {
return UINib(nibName: String(describing: self), bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UserView
}
}
2) 使用单元格进行种植(在:)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier = "UserTableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? UserTableViewCell else {
fatalError("The dequeued cell is not an instance of UserTableViewCell.")
}
let userView = UserView.fromNib()
let user = users[indexPath.row]
userView.username.text = user.username
//Use frame size, but for me better to add 4 constraints
userView.frame = CGRect(x: 0, y: 0, width: cellWidth, height: cellHeight)
cell.contentView.addSubview(UserView)
return cell
}
我有一个带有几个IBOutlet的自定义单元格类。我已经将类添加到故事板。我已经连接了所有的出口。我的cellForRowAtIndexPath函数如下所示: 这是我的自定义单元格类: 当我运行应用程序时,我的所有手机都是空的。我已注销,它包含所有正确的字符串。我还尝试了将一个实际字符串与标签相等,这会产生相同的结果。 我错过了什么?感谢任何帮助。
我有一个带有表视图的Xib(我使用的是Xib而不是常规的故事板,因为我将Xib插入到UIPageView控制器中)。在 Xib 的类中,我注册了一个自定义表视图单元格。尽管单元格插入到表视图中,但它不会根据其约束正确调整大小,也不会更改表视图的显示。 这是我在视图控制器中的设置代码,它具有表视图xib:类 当我运行应用程序时,它看起来像这样: 所以基本上,自定义单元格是从xib文件添加到表格视图中
问题内容: 在我的应用程序中,我有一个表格视图,每个单元格中都有一个图像,标签和文本视图。我希望能够根据文本视图中的内容量自动调整单元格的大小。(文本视图是最下面的文本。) 到目前为止,我已经添加了正确的约束。文本视图的前导,尾随,顶部和底部,并且已禁用滚动和编辑。 在我的tableViewController.swift文件中,我编写了以下代码: 但是,这不起作用,因为当我在文本视图中添加更多文
提前谢谢。
英文原文:http://emberjs.com/guides/views/customizing-a-views-element 视图在页面上表现为一个单一的DOM元素。通过修改tagName属性,可以改变视图生成的元素的类型。 1 2 3 App.MyView = Ember.View.extend({ tagName: 'span' }); 另外,还可以通过设置一个字符串数组到clas
如何自我调整uItableview单元格元素。 自动调整UITableViewCell大小。