2016-06-03 13 views
0

Ich habe eine benutzerdefinierte Zelle im Storyboard erstellt und eine ScrollView darin eingefügt. Nun, was ich tun möchte, ist, erstellen Sie mehrere Schaltflächen basierend auf den Daten von meinem Webservice. Unten ist der Code dafür:Swift-Buttons auf ScrollView in CustomCell, die einander überlappen

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell: MainTableViewCell! = tableView.dequeueReusableCellWithIdentifier("cellIdentifier", forIndexPath: indexPath) as! MainTableViewCell 

    cell.titleLabel.text = self.postsData.objectAtIndex(indexPath.row).valueForKey("title") as? String 
    let imageurl = self.postsData.objectAtIndex(indexPath.row).valueForKey("image") as? String 
    cell.titleImage.load(imageurl!) 

    let jsonStringAsArray = self.postsData.objectAtIndex(indexPath.row).valueForKey("links") 
    let data: NSData = jsonStringAsArray!.dataUsingEncoding(NSUTF8StringEncoding)! 
    let anyObj: AnyObject? = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(rawValue: 0)) 
    var yCoord:CGFloat = 15.0, xCoord:CGFloat = 0.0, buttonHeight:CGFloat = 30.0, buttonWidth:CGFloat = 100.0, buffer:CGFloat = 10.0,i = 0; 

    while i<anyObj?.count { 
     if cell.viewWithTag((indexPath.row+1)*1000+(i+1)) != nil{ 
      print("fake") 

     } 
     else{ 
      let button :UIButton = UIButton() 
      button.frame = CGRectMake(xCoord, yCoord, buttonWidth, buttonHeight) 


      button.setTitleColor(UIColor.greenColor(), forState: .Normal) 
      button.layer.borderWidth = 1.0 
      button.layer.borderColor = UIColor.greenColor().CGColor 
      button.layer.cornerRadius = 10.0 
      button.titleLabel?.font = UIFont(name: "Futura-Medium", size: 17) 
      button.tag = (indexPath.row+1)*1000+(i+1); 
      print(button.tag) 
      button.addTarget(self, action: #selector(MainViewController.linkButtonAction(_:)), forControlEvents: .TouchUpInside) 
      button.setTitle(anyObj?.objectAtIndex(i).valueForKey("title") as? String, forState: .Normal) 
      button.sizeToFit() 
      let tempWidth = button.frame.size.width + 10; 
      button.frame=CGRectMake(xCoord, yCoord, tempWidth, buttonHeight) 

      cell.buttonScrollView.addSubview(button) 


      xCoord += button.frame.size.width + buffer; 

     } 
     i += 1 
    } 
    cell.buttonScrollView.contentSize = CGSizeMake(xCoord, buttonHeight+10) 

    cell.clipsToBounds = true; 

    return cell 
} 

Der Code, den ich geschrieben habe, scheint perfekt zu arbeiten, es sei denn das Problem, dass mit Tasten von den anderen Zellen überlappen Tasten in der ersten und der letzten Zelle ist.

Die erste Zelle zeigt zuerst alle Tasten perfekt an, aber wenn ich nach unten scrolle und wieder zurückkomme, ist alles durcheinander.

Es wird angenommen, wie dies auf allen Zellen: The Second cell

aber scheint wie folgt aus:

the fist cell

ich für Ansichten mit gleichen Tags in der Zelle Überprüfung versucht, und clipsToBounds, wie du im Code siehst, aber nichts hat für mich funktioniert.

Jede Hilfe wird geschätzt. Vielen Dank!

+0

zweite Bildschirm überlappende Taste vor dem Scrollen oder nach Scrollen Bildschirm? –

Antwort

1

Was Sie tun, ist das Hinzufügen der Schaltfläche Unteransichten zu einer Zelle, die bereits konfiguriert war. Sie müssen vorhandene Tasten aus der Zelle entfernen, nachdem Sie dequeueReusableCellWithReuseIdentifier:forIndexPath haben, und sie erneut erstellen.

+0

Du meinst die Gegenstände, die ich vom Storyboard benutzt habe, auch neu? Ich erstelle nur dynamisch die Buttons in der Zelle –

+0

Nein, einfach die Buttons neu erstellen. Fügen Sie alle diese Schaltflächen zu einer Zelle hinzu und verwenden Sie diese Zelle erneut, und die Schaltflächen sind weiterhin vorhanden. Sie haben eine Prüfung für dieses Tag, aber die Schaltflächen, die Sie für diese Zelle hinzugefügt haben, wurden für eine andere Zeile hinzugefügt und haben nicht übereinstimmende Tags. Die Tags machen mich jedoch traurig, fügen eine Eigenschaft für die benutzerdefinierte Zelle hinzu, um ein Array zu behalten und das bei der Wiederverwendung zu löschen. – Acey

+0

Okay, ich kann die Schaltflächen mit removeFromSuperview() entfernen und sie dann neu erstellen. Aber ich bin zu viel Anfänger, um das zu implementieren, was Sie bezüglich der Eigenschaft für eine benutzerdefinierte Zelle sagten. –

0

Ihr Code sehen Sie mir: Ihr Code schreiben Knopfcode sonst, aber wenn Bedingung keinen Knopf bezogenen Code.

Versuchen Sie meinen Berater von Ihnen auch schreiben Code in wenn Bedingung im Gegensatz zu sonst Bedingung. nach der Überprüfung einige Zeit Sie nicht löschen Sie sonst Bedingung Code, den Sie scrollen Sie Controller, dass Element überlappt, dass Schreiben Sie Code-Schaltfläche in If-Bedingung schreiben.

Verwandte Themen