2016-06-19 12 views
9

Ich bin im Prozess der Aktualisierung meiner App auf iOS10 mit Swift 2.3 und Xcode 8 Beta 1 und ich habe festgestellt, dass es eine UITableViewHeaderFooterContentView, die Berührungen der UIButton auf meinem blockiert Unterklasse von UITableViewHeaderFooterView.iOS10 - ContentView Blockieren Touches von UIButton in UITableView Header

Auf dem Xcode 8 Beta 1 Simulator funktioniert die UIButton auf iOS9.3, aber nicht auf iOS10.

1) Gibt es dafür Unterlagen?

2) Wie kann ich sicherstellen, dass meine UI-Elemente auf der neuen Inhaltsansicht in iOS10 stehen? (oder erlauben Berührungen durch die UITableHeaderFooterContentView)

Vielen Dank!

Debug View Hierarchy of iOS9.3 and iOS10

TableHeader.xib

Tabellenkopf

import UIKit 

class TableHeader: UITableViewHeaderFooterView { 

    @IBOutlet weak var dayLabel: UILabel! 

    @IBOutlet weak var dateLabel: UILabel! 

    @IBOutlet weak var addNewEventButton: UIButton! 

} 

Code-View-Controller dateCell.addNewEventButton ist die UIButton, die nicht mehr berührt in iOS10

Empfang
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 


    let tintColor = TintManager().getTintColour() 

    let dateCell:TableHeader = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") as! TableHeader 

    //dateCell.bringSubviewToFront(dateCell.addNewEventButton) 

    dateCell.dayLabel.text = Dates.day.uppercaseString 

    dateCell.dateLabel.text = Dates.date 

     dateCell.backgroundView = UIView(frame: dateCell.frame) 
     dateCell.backgroundView!.backgroundColor = tintColor 
     dateCell.dayLabel.textColor = UIColor.whiteColor() 
     dateCell.dateLabel.textColor = UIColor.whiteColor() 
     dateCell.addNewEventButton.backgroundColor = tintColor 



    dateCell.addNewEventButton.tag = section 
    dateCell.addNewEventButton.layer.cornerRadius = 20.0 

    if (savedEventView.superview === self.view) { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddButtonToInsertSavedEvent(_:)), forControlEvents:.TouchUpInside) 
    } else { 
     dateCell.addNewEventButton.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 
     dateCell.addNewEventButton.addTarget(self, action: #selector(ViewController.userPressedAddNewEventOnTableViewHeader(_:)), forControlEvents:.TouchUpInside) 
    } 

    return dateCell 
} 
+0

Bitte gehen Sie durch Dokument Migration swift .Ich denke 3.0 in Xcode vorstellen 8 Beta 1 – Tuple

+0

Es ist mein Verständnis, dass Swift 2.3 in Xcode 8 Beta 1 –

+0

Ja natürlich Ihr Verständnis ist richtig – Tuple

Antwort

4

Die problematische Ansicht ist in der Tat die contentView der UITableViewHeaderFooterView (siehe Apple Docs). Sie sollten also nur sendSubview(toBack:) verwenden können, um zu verhindern, dass es die Berührungen stört.

Es scheint jedoch, dass unter UITableViewHeaderFooterViewcontentView nicht ordnungsgemäß initialisiert wird, wenn die Ansicht von einer NIB geladen wird. Obwohl die contentView -Eigenschaft nicht optional ist, ist es tatsächlich Null, und Sie erhalten einen BAD ACCESS-Fehler, wenn Sie versuchen, darauf zuzugreifen. Sie können auch keinen Wert für contentView (entweder in Code oder als Ausgang in IB) festlegen, da es sich um eine schreibgeschützte Eigenschaft (*) handelt. Die einzige Lösung, an die ich denken kann, ist die Verwendung von #available, um Code zu verwenden, um contentView nach hinten zu verschieben, wenn Sie auf iOS 10 oder neuer laufen. Ich würde den entsprechenden Code in Ihre Unterklasse setzen:

override func awakeFromNib() { 
    if #available(iOS 10, *) { 
     self.sendSubview(toBack: contentView) 
    } 
} 

(*) Schwelgen in wilden Spekulationen, meine Vermutung ist, dass Apple die UITableViewHeaderFooterView Code stark auf UITableViewCell basiert. Da IB UITableViewCells in seiner Objektbibliothek hat (und beachten Sie, dass diese die Zelle contentView enthalten), kann es sicherstellen, dass die contentView der Zelle ordnungsgemäß instanziiert wird. Aber da es in der Objektbibliothek kein UITableViewHeaderFooterView gibt, gibt es keine Möglichkeit, das contentView korrekt geladen zu bekommen. Sieht aus, als hätten sie es in iOS10 behoben, indem sie eine leere contentView instanziiert haben. Schade, dass sie nicht auch UITableViewHeaderFooterView zur Bibliothek hinzugefügt haben.

+0

Ich hatte kein Problem mit der Verwendung Ihrer noch kompatibel ist Code mit iOS9. Etwas wie: - (UIView *) tableview: (UITableView *) tableview viewForHeaderInSection: (NSInteger) headerIndex { ... NSArray * nib = [[NSBundle Main] loadNibNamed ... ... [headerView sendSubviewToBack: [headerView contentView]]; ... } – Darko

+0

@Darko Interessant. Ich habe festgestellt, dass das Problem aufgetreten ist, wenn ich die Feder registriert und dann aus der Warteschlange genommen habe; Ich habe nicht versucht, die Feder direkt zu laden. Aber sie sollten beide den anstößigen 'init (coder:)' Initialisierer benutzen, also muss ich vielleicht etwas mehr untersuchen. Oder es könnte sein, dass Objective-C toleranter gegenüber Nullwerten ist. – pbasdf

+0

Möglich. Ich habe es mit iOS 9 getestet und es funktioniert, aber um auf der sicheren Seite zu sein, überprüfe ich auch die iOS-Version, bevor ich diesen Code benutze, tut es nicht weh :) – Darko