Swift의 닙에서 사용자 지정 UITableViewCell
닙에서 사용자 지정 테이블 뷰 셀을 작성하려고 합니다.저는 여기 이 기사를 참고하고 있습니다.저는 두 가지 문제에 직면해 있습니다.
UITableViewCell 개체를 끌어다 .xib 파일을 만들었습니다.는 하위클래만니다습들의 .UITableViewCell
셀의 클래스로 설정하고 재사용 가능한 식별자로 Cell을 설정합니다.
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
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
}
}
UITableViewController에 이 코드가 있습니다.
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
이 코드는 오류가 없지만 시뮬레이터에서 실행하면 다음과 같습니다.
스토리보드의 UITableViewController에서 셀에 대해 수행한 작업이 없습니다.식별자가 비어 있고 하위 클래스가 없습니다.프로토타입 셀에 Cell 식별자를 추가하여 다시 실행해 보았지만 동일한 결과가 나왔습니다.
또 다른 오류는 UITableViewController에서 다음 방법을 구현하려고 했을 때 발생했습니다.
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
제가 언급한 기사에 나와 있는 것처럼, 저는 그것을 바꿨습니다.cell
의 형식 형식 매개 변의 형양식UITableViewCell
CustomOneCell
UITableViewCell은 다음과 같습니다. 저는 과 같은오류를 .
선택기 'tableView:willDisplayCell:forRowAtIndexPath:'이(가) 호환되지 않는 유형 '(UITableView!, CustomOneCell!, NSIndexPath!) ->()'인 메서드를 재정의합니다.
이러한 오류를 해결하는 방법을 아는 사람이 있습니까?이것들은 목표-C에서 잘 작동하는 것처럼 보였습니다.
감사해요.
편집: 시뮬레이터의 방향을 가로로 변경하고 다시 세로로 돌리면 셀이 나타납니다!저는 여전히 무슨 일이 일어나고 있는지 알 수 없었습니다.당신이 잠깐 볼 시간이 있다면 문제를 보여주는 Xcode 프로젝트를 여기에 올렸습니다.
Swift 5 및 iOS 12.2에서는 문제를 해결하기 위해 다음 코드를 시도해야 합니다.
CustomCell.swift
import UIKit
class CustomCell: UITableViewCell {
// Link those IBOutlets with the UILabels in your .XIB file
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
}
TableViewController.swift
import UIKit
class TableViewController: UITableViewController {
let items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
}
// MARK: - UITableViewDataSource
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
return cell
}
}
아래 이미지는 Xcode의 제약 조건 모호성 메시지 없이 제공된 코드로 작동하는 일련의 제약 조건을 보여줍니다.
Swift 2와 Xcode 7.3을 사용한 접근 방식은 다음과 같습니다.이 예제에서는 단일 View 컨트롤러를 사용하여 두 개의 .xib 파일(하나는 UITableView용, 다른 하나는 UITableCellView용)을 로드합니다.
이 예에서는 UITableView를 빈 TableNib.xib 파일에 바로 놓을 수 있습니다.내부에서 파일 소유자를 ViewController 클래스로 설정하고 아웃렛을 사용하여 테이블 View를 참조합니다.
그리고.
이제 보기 컨트롤러에서 테이블 보기를 일반적인 방식으로 위임할 수 있습니다.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
...
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Table view delegate
self.tableView.delegate = self
self.tableView.dataSource = self
...
사용자 지정 셀을 만들려면 Table View Cell 개체를 빈 TableCellNib.xib 파일에 놓습니다.이번에는 cell.xib 파일에서 "owner"를 지정할 필요는 없지만 사용자 지정 클래스와 "TableCellId"와 같은 식별자를 지정해야 합니다.
필요한 아웃렛으로 서브클래스를 만듭니다.
class TableCell: UITableViewCell {
@IBOutlet weak var nameLabel: UILabel!
}
드디어...View 컨트롤러에서 전체를 로드하고 표시할 수 있습니다.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// First load table nib
let bundle = NSBundle(forClass: self.dynamicType)
let tableNib = UINib(nibName: "TableNib", bundle: bundle)
let tableNibView = tableNib.instantiateWithOwner(self, options: nil)[0] as! UIView
// Then delegate the TableView
self.tableView.delegate = self
self.tableView.dataSource = self
// Set resizable table bounds
self.tableView.frame = self.view.bounds
self.tableView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
// Register table cell class from nib
let cellNib = UINib(nibName: "TableCellNib", bundle: bundle)
self.tableView.registerNib(cellNib, forCellReuseIdentifier: self.tableCellId)
// Display table with custom cells
self.view.addSubview(tableNibView)
}
코드는 단순히 니브 파일(테이블)을 로드하고 표시하는 방법과 두 번째로 셀 사용을 위해 니브를 등록하는 방법을 보여줍니다.
이것이 도움이 되길 바랍니다!!!
스위프트 4
레지스터 니브
override func viewDidLoad() {
super.viewDidLoad()
tblMissions.register(UINib(nibName: "MissionCell", bundle: nil), forCellReuseIdentifier: "MissionCell")
}
테이블에서 데이터 원본 보기
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "MissionCell", for: indexPath) as? MissionCell else { return UITableViewCell() }
return cell
}
스크린샷이 포함된 상세 솔루션
- 하고 파일 을 " " " "로 지정합니다.
MyCustomCell.xib
.
- 추가
UITableViewCell
xib 파일의 루트 및 원하는 기타 시각적 구성 요소로 사용할 수 있습니다.
- 이름으로 .
MyCustomCell
분서로의 로서.UITableViewCell
.
- 사용자 지정 테이블 보기 셀에 대한 사용자 지정 클래스 및 재사용 식별자를 설정합니다.
- 보조 편집기를 열고
ctrl+drag
시각적 구성 요소를 위한 배출구를 만듭니다.
- 을 합니다.
UIViewController
사용자 지정 셀을 사용합니다.
class MyViewController: UIViewController {
@IBOutlet weak var myTable: UITableView!
override func viewDidLoad {
super.viewDidLoad()
let nib = UINib(nibName: "MyCustomCell", bundle: nil)
myTable.register(nib, forCellReuseIdentifier: "MyCustomCell")
myTable.dataSource = self
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell") as? MyCustomCell {
cell.myLabel.text = "Hello world."
return cell
}
...
}
}
swift 4.1.2
xib의
ImageCell2.swift 만들기
1단계
import UIKit
class ImageCell2: UITableViewCell {
@IBOutlet weak var imgBookLogo: UIImageView!
@IBOutlet weak var lblTitle: UILabel!
@IBOutlet weak var lblPublisher: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
2단계. View 컨트롤러 클래스에 따름
import UIKit
class ImageListVC: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var tblMainVC: UITableView!
var arrBook : [BookItem] = [BookItem]()
override func viewDidLoad() {
super.viewDidLoad()
//Regester Cell
self.tblMainVC.register(UINib.init(nibName: "ImageCell2", bundle: nil), forCellReuseIdentifier: "ImageCell2")
// Response Call adn Disply Record
APIManagerData._APIManagerInstance.getAPIBook { (itemInstance) in
self.arrBook = itemInstance.arrItem!
self.tblMainVC.reloadData()
}
}
//MARK: DataSource & delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.arrBook.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// [enter image description here][2]
let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell2") as! ImageCell2
cell.lblTitle.text = self.arrBook[indexPath.row].title
cell.lblPublisher.text = self.arrBook[indexPath.row].publisher
if let authors = self.arrBook[indexPath.row].author {
for item in authors{
print(" item \(item)")
}
}
let url = self.arrBook[indexPath.row].imageURL
if url == nil {
cell.imgBookLogo.kf.setImage(with: URL.init(string: ""), placeholder: UIImage.init(named: "download.jpeg"))
}
else{
cell.imgBookLogo.kf.setImage(with: URL(string: url!)!, placeholder: UIImage.init(named: "download.jpeg"))
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 90
}
}
아래와 같이 니브를 등록하지 않았습니다.
tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
다른 방법으로는 클래스를 등록하는 것이 좋습니다.
사용자 지정 테이블을 생성한다고 가정합니다. 다음과 같은 보기:
class UICustomTableViewCell: UITableViewCell {...}
그런 다음 "registerClass"로 표시할 모든 UITableViewController에 셀을 등록할 수 있습니다.
override func viewDidLoad() {
super.viewDidLoad()
tableView.registerClass(UICustomTableViewCell.self, forCellReuseIdentifier: "UICustomTableViewCellIdentifier")
}
행 방법에 대해 셀에서 예상하는 대로 호출할 수 있습니다.
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("UICustomTableViewCellIdentifier", forIndexPath: indexPath) as! UICustomTableViewCell
return cell
}
"재지정 방법..."을 수정합니다. 호환되지 않는 유형이 있습니다.오류 함수 선언을 다음으로 변경했습니다.
override func tableView(tableView: (UITableView!),
cellForRowAtIndexPath indexPath: (NSIndexPath!))
-> UITableViewCell {...}
(그랬습니다.-> UITableViewCell!
)
콘센트를 만들 때 개체의 소유자가 아닌 셀에 연결하도록 지정해야 했습니다.메뉴 이름이 나타나면 'object' 드롭다운 메뉴에서 선택해야 합니다.물론 'TableViewCellClass' 뿐만 아니라 셀을 클래스로 선언해야 합니다.그렇지 않으면 수업이 계속 키를 준수하지 않을 것입니다.
클래스 UITableViewCell을 사용하여 간단히 xib를 사용할 수 있습니다.요구 사항에 따라 UI를 설정하고 IOutlet을 할당합니다.다음과 같이 테이블 뷰의 cellForRowAt()에서 사용합니다.
//MARK: - table method
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.arrayFruit.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:simpleTableViewCell? = tableView.dequeueReusableCell(withIdentifier:"simpleTableViewCell") as? simpleTableViewCell
if cell == nil{
tableView.register(UINib.init(nibName: "simpleTableViewCell", bundle: nil), forCellReuseIdentifier: "simpleTableViewCell")
let arrNib:Array = Bundle.main.loadNibNamed("simpleTableViewCell",owner: self, options: nil)!
cell = arrNib.first as? simpleTableViewCell
}
cell?.labelName.text = self.arrayFruit[indexPath.row]
cell?.imageViewFruit.image = UIImage (named: "fruit_img")
return cell!
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 100.0
}
100% 문제 없이 작동(테스트 완료)
이 줄은 추가TableView
셀:
static var nib : UINib{
return UINib(nibName: identifier, bundle: nil)
}
static var identifier : String{
return String(describing: self)
}
다음과 같이 뷰 컨트롤러에 등록합니다.
이 줄은 다음에서 사용됩니다.viewDidLoad
tableview.register(TopDealLikedTableViewCell.nib, forCellReuseIdentifier: TopDealLikedTableViewCell.identifier)
인덱스 경로의 행에 대한 셀
if let cell = tableView.dequeueReusableCell(withIdentifier:
TopDealLikedTableViewCell.identifier) as? TopDealLikedTableViewCell{
return cell
}
return UITableViewCell()
셀에 설정
static var identifier : String {
return String(describing: self)
}
static var nib : UINib {
return UINib(nibName: identifier, bundle: nil)
}
언급URL : https://stackoverflow.com/questions/25541786/custom-uitableviewcell-from-nib-in-swift
'programing' 카테고리의 다른 글
Excel: SQL 쿼리에 대한 매개 변수로 셀 값 사용 (0) | 2023.05.24 |
---|---|
iOS 8에서 엔터프라이즈 앱 업데이트 배포 (0) | 2023.05.24 |
Razor_layout.cshtml에 파일 이름에 선행 밑줄이 있는 이유는 무엇입니까? (0) | 2023.05.24 |
.NET에서 현재 스택 추적을 예외 없이 인쇄하는 방법은 무엇입니까? (0) | 2023.05.24 |
따옴표를 자동으로 닫는 성가신 일식 (0) | 2023.05.24 |