2017-01-30 3 views
3

Ich habe einen View-Controller mit mehreren Collection-Ansichten.Mehrfachsammlungsansichten mit derselben XIB-Zelle und Schaltfläche

Jede Sammlungsansicht verwendet dieselbe benutzerdefinierte Zelle mit xib. In dieser XIB habe ich einen Knopf.

Die collectionViews Namen sind

1) manPerfumeCV 
2) womanPerfumeCV 
3) kidsPerfumeCV 

Innen cellForItemAt i cell.productCart.tag = indexPath.row

let cell:iPhoneCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "iPhoneCell", for: indexPath) as! iPhoneCollectionViewCell 
    if collectionView == self.womanPerfumeCV { 

     let prods = womanPerfumeData[indexPath.row] 
     cell.configureCell(products: prods) 
     cell.productCart.tag = indexPath.row 

    } else if collectionView == self.manPerfumeCV { 
     let prods = manPerfumeData[indexPath.row] 
     cell.configureCell(products: prods) 
     cell.productCart.tag = indexPath.row 

    } else if collectionView == self.kidsPerfumeCV { 
     let prods = kidsPerfumeData[indexPath.row] 
     cell.configureCell(products: prods) 
     cell.productCart.tag = indexPath.row 

    } 

und in der gleichen Ansicht Controller haben habe ich diese Aktion für die Schaltfläche aus der xib Datei

@IBAction func iPhoneAddToCart(_ sender: AnyObject) { 
     let butt = sender as! UIButton 
     let indexP = IndexPath(row: butt.tag, section: 0) 
     let cell = manPerfumeCV.cellForItem(at: indexP) as! iPhoneCollectionViewCell 

     print(manPerfumeData[indexP.row].price) 

    } 

Jede Kollektionsansicht hat ihre eigenen [Produkte] ar Strahl.

1) manPerfumeData 
2) womanPerfumeData 
3) kidPerfumeData. 

In meinem Code, wenn ich auf die Schaltfläche tippen, die mit manPerfumeData an der ersten Sammlung Sicht ist es sehr gut, den Preis druckt.

Obwohl, wenn ich den Knopf auf der 2. oder 3. Sammlung drücken, stürzt die App ab.

Gibt es eine Möglichkeit zu wissen, von welcher Sammelansicht er den Knopf drückte, damit ich das spezifische [Products] Array laden kann?

Danke!

+0

was sehen Sie in Debugger-Ausgabedatei machen hinzufügen? –

+0

@SinaKH Schwerwiegender Fehler: unerwartet gefunden Null beim Entpacken ein Optionaler Wert 2017-01-30 14: 25: 38.928171 Aromania [19538: 6823926] Schwerwiegender Fehler: unerwartet beim Dekomprimieren Null gefunden Optionaler Wert Es ist weil in 'print' Ich habe nur die 'manPerfumeData'. Wie kann ich erkennen, in welcher Sammlungsansicht der Button gedrückt wurde? –

Antwort

3

Sie können tag Eigenschaft von UIButton verwenden. Lassen Sie betrachten Sie den Code

let cell:iPhoneCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "iPhoneCell", for: indexPath) as! iPhoneCollectionViewCell 
if collectionView == self.womanPerfumeCV { 
    //Your Code 
    cell.productCart.tag = indexPath.row + 1000 

} else if collectionView == self.manPerfumeCV { 
    //Your Code 
    cell.productCart.tag = indexPath.row + 2000 

} else if collectionView == self.kidsPerfumeCV { 
    //Your Code 
    cell.productCart.tag = indexPath.row + 3000 
} 

Sie bemerkt, dass ich die tag Eigenschaft UIButton geändert. Wenn Sie nun auf die Schaltfläche tippen, überprüfen Sie tag Eigenschaft von UIButton. Gefällt Ihnen dieses

if (sender.tag >= 1000 && sender.tag<2000) 
{ 
    //manPerfumeCV 
} 
else if (sender.tag >= 2000 && sender.tag<3000) 
{ 
    //womanPerfumeCV 
} 
else 
{ 
    //kidsPerfumeCV 
} 

Für Wert von Array zu holen, subtrahieren den Anfangswert von tag Eigenschaft und Sie werden Wert erhalten, wie diese

Für manPerfumeCV

indexValue = sender.tag - 1000 

Für womanPerfumeCV

indexValue = sender.tag - 2000 

Für kidsPerfumeCV

indexValue = sender.tag - 3000 

Dieser Wert kann für Abrufen von Daten aus dem Array direkt verwenden.

+0

ok ich werde es versuchen. –

+0

ja es ist korrekt !!! Ich habe über das letzte Update, das du gemacht hast, herausgefunden, dass ich '1000 'oder sowieso die Nummer, die ich oben an jedem Tag hinzugefügt habe, machen muss! Vielen Dank Kumpel: D –

2

Inorder es erreichen Sie Tag-Eigenschaft auf die collectionViews in viewDidLoad hinzufügen

override func viewDidLoad() { 

// your code 

self.womanPerfumeCV.tag = 0; 
self.manPerfumeCV.tag = 1; 
self.kidsPerfumeCV = 2; 

} 

mit diesem Sie die Quelle

// Jetzt identifizieren kann seine Zeit mit dem Button

hört

Ich würde vorschlagen, den Event-Listener in der gleichen Controller zu halten oder einen Protokoll-Callback nur mit Index und Tag zu machen.
Damit lässt es einfach die Änderungen in derselben Viewcontroller

if collectionView == self.womanPerfumeCV { 

    let prods = womanPerfumeData[indexPath.row] 
    cell.configureCell(products: prods) 
    cell.productCart.tag = indexPath.row 

} else if collectionView == self.manPerfumeCV { 
    let prods = manPerfumeData[indexPath.row] 
    cell.configureCell(products: prods) 
    cell.productCart.tag = indexPath.row 

} else if collectionView == self.kidsPerfumeCV { 
    let prods = kidsPerfumeData[indexPath.row] 
    cell.configureCell(products: prods) 
    cell.productCart.tag = indexPath.row 

} 

cell.yourButton.tag = (collectionView.tag * 1000)+(indexPath.row); 
     cell.yourButton.addTarget(self, action: #selector(ButtonClicked(_:)), forControlEvents: .TouchUpInside) 


jetzt Wähler Ereignis

func ButtonClicked(sender: UIButton) { 
    let index : Int = sender.tag % 1000; 
    switch sender.tag { 
     case let x where x < 1000: 
     loadDataFromFirstArrayWithIndex(index);break; 
     case let x where x <2000: 
     loadDataFromSecondArrayWithIndex(index);break; 
     default: 
     loadDataFromThirdArrayWithIndex(index); 

    } 
} 
Verwandte Themen