2016-08-21 2 views
0

동적으로 UITableView를 만들고이를 사전으로 채워진 Array로 채 웁니다. 문제는 사전에서 일부 변경 작업을 수행 한 후에 그에 따라 Array를 다시 채우고 tableview 데이터를 다시로드하면 이전 셀 데이터가 남아 있고 새 데이터가 이전 데이터에 기록된다는 것입니다. 메서드 호출의 순서를 변경하거나, 하위 뷰에 대해 viewWithTag를 사용하고, superviews에서 하위 뷰를 제거한 후 다시 추가하는 등 많은 해결 방법을 시도했습니다. 대부분의 응답이 오래되어 "셀 (셀 == nil) "나는 그 길을 택하지 않는 반면. 여기에 코드입니다 :UITableView reloadData()가 이전 셀 데이터를 덮어 씁니다.

var sepetDict: [String: Int] = [:] 

var sepetDictCopy = [String]() 

override fun viewDidLoad() { 
    sepetTableView.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width, sepetDialogView.bounds.size.height) 
    sepetTableView.delegate = self 
    sepetTableView.dataSource = self 
    sepetTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "sepetCell") 
} 

func sepetClick() { 
    sepetDictCopy.removeAll() 
    sepetDictCopy = Array(sepetDict.keys) 
    sepetTableView.reloadData() 
    sepetTableView.removeFromSuperview() 

    self.view.addSubview(sepetDialogView) 
    sepetDialogView.addSubview(sepetTableView) 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell", forIndexPath: indexPath) 

    let sepetNameLabel = UILabel() 

    sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
    sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
    sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
    sepetNameLabel.numberOfLines = 0 
    sepetNameLabel.textAlignment = NSTextAlignment.Left 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    sepetCell.contentView.addSubview(sepetNameLabel) 

    return sepetCell 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return sepetDictCopy.count 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60 
} 

이 경우, 내가있는 UIButton 클릭, 그것은 UIView의 팝업 및 jQuery과는 서브 뷰 등이있는 UIView에 추가됩니다. 처음 클릭하면 모든 것이 잘 작동합니다. 해당 UIView 닫고 단추를 다시 클릭하면이 시간 tableview 새 데이터 (정확한 데이터뿐만 아니라)로드하지만 이전 데이터를 덮어 씁니다. 제공된 코드에서 배열에 데이터를 추가하지 않지만 문제는 동일합니다. 예를 들어 UILabel에 "Pizza"라고 쓰여졌 고 테이블을 다시로드 할 때 여전히 "Pizza"가 있었으므로 시간이 어두워집니다 (이전 레이블에서 레이블을 덮어 쓰게됩니다). "Burger"를 배열에 추가한다고 가정하면 tableview에 "Burger"와 "Pizza"가 표시되지만 이번에는 "Burger"가 이전 피자의 인덱스 0에 쓰여지고 "Pizza"는 인덱스 1에만 쓰입니다. 또한 제대로 이해하지 못할 경우 추가 정보 나 문제의 사진을 제공 할 수 있습니다.

+1

은 스토리 보드의 셀에 레이블을 추가하고 사용자 정의 클래스에 연결 또는'viewWithTag를 사용하여 잡아 시도 되세요 '(이 방법을 사용하여 언급 한 것을 알고 있지만 사용 방법에 대한 컨텍스트가 없습니다.) 어쩌면 당신은'sepetNameLabel'에 태그를 설정하고 새로운 레이블을 생성하고 추가하기 전에 그것을 검색하려고 시도해야합니다. 기본적으로 위의 코드를 사용하면 셀에 이미 레이블이 있어도 항상 다른 레이블을 추가합니다. 그것이 있는지 확인해야합니다 (아마'tag' 속성을보고 초기 레이블을 추가하기 전에'viewWithTag'을 확인하십시오) – DMCApps

+0

[UITableViewCell addSubview 반복 객체] (http://stackoverflow.com/questions/)의 가능한 복제본 11702635/uitableviewcell-addsubview-repeating-object) –

+0

몇 가지 스크린 샷을 제공해 주실 수 있습니까? – KSR

답변

0

나는 viewWithTag 메서드의 개념을 이해하지 못했던 것처럼 보입니다. 나는 코드를 재정렬하고 효과가 있었다. 날짜 응답 코드에 최대를 찾고있는 사람들을 위해, 여기있다 :

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var sepetCell: UITableViewCell! = sepetTableView.dequeueReusableCellWithIdentifier("") 

    if (sepetCell == nil) { 
     sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell")! 

     let sepetNameLabel = UILabel() 

     sepetNameLabel.tag = 1 

     sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
     sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
     sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
     sepetNameLabel.numberOfLines = 0 
     sepetNameLabel.textAlignment = NSTextAlignment.Left 

     sepetCell.contentView.addSubview(sepetNameLabel) 
    } 

    let sepetNameLabel = sepetCell.contentView.viewWithTag(1) as! UILabel 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    return sepetCell 
} 
+0

왜 코드에 뷰를 추가합니까? Interface Builder에서 IBOutlets로 디자인 된 사용자 정의 테이블 뷰 셀을 사용하는 것이 훨씬 쉽습니다. 사용중인 튜토리얼의 날짜를 확인하십시오. 이 중 많은 사람들이'viewWithTag'와 같은 구식 절차를 제안합니다. – vadian

+0

다른 화면 크기로 작업하고 있는데 모두 크기를 정확하게 조정해야합니다. 그 목적을 위해 스토리 보드를 사용하여 동일한 성능을 얻을 수 없었습니다. –

+0

잘 알고 있습니다 .-) – vadian

관련 문제