2017-12-17 11 views
1

저는 현재 Uber, half Tinder와 같은 기능을 갖춘 앱을 개발 중입니다.하나의 tableView에서 다양한 유형의 셀을 만드는 방법은 무엇입니까?

프로파일 편집을 위해 TableView를 작성하여 Tinder의 프로파일 편집보기를 볼 수있게 만들고 싶습니다.

프로필 이미지를 가져 오는 첫 번째 셀과 textLabel의 두 번째 셀을 성공적으로 만들었습니다.

편집 가능한 TextView가있는 세 번째 셀을 만들고 싶습니다. 사용자가 여러 줄의 단어를 입력 할 수 있도록 textField가 아닙니다. 그러나 코드는 의도 한대로 작동하지 않습니다.

사용자 지정 셀 클래스에서 textView를 만들고 내 tableViewController 클래스의 세 번째 tableView 셀로 설정했지만 시뮬레이터에 나타나지 않는 것처럼 보입니다.

하나의 tableView에 대해 여러 유형의 셀을 만드는 좋은 방법이 무엇인지 아직 확실하지 않으므로 다른 방법이 있다면 알아두면 좋을 것입니다.

이 문제와 관련된 내 코드는 다음과 같습니다.

의 ViewController

//EditProfileViewController For The Profile Edit view 
class EditProfileViewController: UINavigationController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

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

} 

TableViewController

//MyTableViewController for the EditProfileViewController 
class EditProfileTableViewController: UITableViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextViewDelegate { 
override func viewDidLoad() { 
    super.viewDidLoad() 

} 

    override func numberOfSections(in tableView: UITableView) -> Int { 

    return 3 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if section == 0 { 
     return 5 
    } else if section == 1 { 
     return 2 
    } else { 
     return 4 
    } 
} 


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    //link my custom Cell here 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "MyCustomCell", for: indexPath) as? MyCellTableViewCell { 

     if indexPath.section == 0 { 

      if indexPath.row == 0 { 
       //this row is for an Image Picker 
       cell.textLabel?.text = "edit profile image" 
      } else if indexPath.row == 1 { 
       //this row is just like a title of third cell which is editable self description 
       cell.textLabel?.text = "Describe yourself" 
       cell.isUserInteractionEnabled = false 
      } else if indexPath.row == 2 { 
       //this row is an editable self description 
       cell.addSubview(cell.selfDescritionTextView) 
       cell.selfDescritionTextView.delegate = self 
       cell.selfDescritionTextView.isEditable = true 
       cell.selfDescritionTextView.text = "Enter some descriptions here" 


      } 

     } 

     else if indexPath.section == 1 { 
      cell.textLabel?.text = "section 1" 


     } 

     else if indexPath.section == 2 { 
      cell.textLabel?.text = "section 2" 

     } 


     return cell 
    } else { 
     //Just in case 
     return UITableViewCell() 
    } 
} 

} 

TableViewCell

//MyCellTableViewCell 
class MyCellTableViewCell: UITableViewCell { 

//create a textView for self description 
var selfDescritionTextView = UITextView() 

//init 
override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
    super.init(style: .default, reuseIdentifier: "MyCustomCell") 
    selfDescritionTextView = UITextView(frame: self.frame) 
    self.addSubview(selfDescritionTextView) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 


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 
} 

} 

여기서 보여준 것보다 많은 코드를 알고 싶다면 알려 주시기 바랍니다.

프로필 편집보기를 만드는 데이 방법에 사로 잡히지 않으므로 누구나 이보다 다른 방법을 더 잘 알고 있다면 잘 알고 싶습니다.

감사

+0

모든 셀이 테이블보기에 포함되어 있습니까? 모든 셀에 맞춤 클래스가 있습니까? –

+0

중단 점을 사용하고 조건에 따라 컨트롤이 cellForRow를 통해 전달되는지 확인할 수 있습니다. if cell = tableView.dequeueReusableCell (withIdentifier : "MyCustomCell", for : indexPath)? MyCellTableViewCell – MBN

+0

그리고 MyCellTableViewCell에 대한 스토리 보드 또는 사용자 정의 셀 xib에서 tableview 프로토 타입 셀을 사용하고 있습니까? – MBN

답변

1
override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    tableView.register(UINib(nibName: TableViewCell1.NibName, bundle: nil), forCellReuseIdentifier: TableViewCell1.Identifier) 
    tableView.register(UINib(nibName: TableViewCell2.NibName, bundle: nil), forCellReuseIdentifier: TableViewCell2.Identifier) 
    tableView.register(UINib(nibName: TableViewCell3.NibName, bundle: nil), forCellReuseIdentifier: TableViewCell3.Identifier) 
} 

당신은 각각의 파단으로, 3 개 사용자 정의 테이블보기 세포를해야합니다 :

class MyCellTableViewCell1: UITableViewCell { 
    static var NibName: String = String(describing: TableViewCell1.self) 
    static var Identifier: String = "TableViewCell1" 

    func configure() { ... } 
} 

다음 :

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell 
    // link my custom Cell here. 

    if indexPath.row == 0, let dequeuedCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell1.Identifier, for: indexPath) as? TableViewCell1 { 
     dequeuedCell.configure() 
     cell = dequeuedCell 
    } 
    else if indexPath.row == 1, let dequeuedCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell2.Identifier, for: indexPath) as? TableViewCell2 { 
     dequeuedCell.configure() 
     cell = dequeuedCell 
    } 
    else if indexPath.row == 2, let dequeuedCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell3.Identifier, for: indexPath) as? TableViewCell3 { 
     dequeuedCell.configure() 
     cell = dequeuedCell 
    } 
    else { 
     cell = UITableViewCell() 
    } 


    return cell 

} 
+0

답장을 보내 주셔서 감사합니다! 모든 코멘트에서 스토리 보드에 3 개의 셀을 만들고 각각에게 reuseidentifier를 줄 필요가있는 것 같습니다! 다음 사용자 지정 셀을 각각 만듭니다. 솔직히 말하면, 스토리 보드에 하나 이상의 셀을 만들 수 있다는 것을 알지 못했습니다 (그래서 저는 프로토 타입 셀 하나만 가지고 여러 셀을 만들었습니다.)! 시도해 볼게! 다시 한번 고마워요 !! – George

1

등록 여러 펜촉이 같은 파일 만 에있는 viewDidLoad

tableView.register(UINib(nibName: "TableViewCell1", bundle: nil), forCellReuseIdentifier: CellIdentifier1) 

    tableView.register(UINib(nibName: "TableViewCell2", bundle: nil), forCellReuseIdentifier: CellIdentifier2) 

    tableView.register(UINib(nibName: "TableViewCell3", bundle: nil), forCellReuseIdentifier: CellIdentifier3) 
+0

내 tableViewController 클래스 (viewDidLoad)에 my cellClass를 등록하고 textView가 실제로 등장했습니다 !! 그러나 이미지 피커였던 첫 번째 셀에 나타났습니다. 나는 customView 셀에서 textView를 정의했기 때문에 내 tableViewController에서 이미지 피커 (첫 행 셀)를 정의했기 때문에 그 것 같습니까? reuseidentifier가있는 하나의 프로토 타입 셀만 사용하고 있기 때문에 너무 복잡합니다. – George