2016-06-19 19 views
9

Sono in procinto di aggiornare la mia app a iOS10 con Swift 2.3 e Xcode 8 Beta 1 e ho trovato che c'è un UITableViewHeaderFooterContentView che sta bloccando i tocchi a UIButton sul mio sottoclasse di UITableViewHeaderFooterView.iOS10 - Tentativi di blocco ContentView di UIButton in UITableView Header

Sul simulatore Xcode 8 Beta 1 UIButton funziona su iOS9.3 ma non su iOS10.

1) C'è qualche documentazione per questo?

2) Come posso garantire che i miei elementi dell'interfaccia utente siano in cima alla nuova vista contenuto in iOS10? (o consenti i tocchi attraverso lo UITableHeaderFooterContentView)

Grazie!

Debug View Hierarchy of iOS9.3 and iOS10

TableHeader.xib

Tabella intestazione

import UIKit 

class TableHeader: UITableViewHeaderFooterView { 

    @IBOutlet weak var dayLabel: UILabel! 

    @IBOutlet weak var dateLabel: UILabel! 

    @IBOutlet weak var addNewEventButton: UIButton! 

} 

codice In View Controller dateCell.addNewEventButton è l'UIButton che non sta ricevendo tocchi in iOS10

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

prega di passare attraverso il documento di migrazione .I pensare SWIFT 3.0 introdurre in Xcode 8 Beta 1 – Tuple

+0

E 'la mia comprensione che Swift 2.3 è ancora compatibile in Xcode 8 Beta 1 –

+0

Sì, naturalmente, la vostra comprensione è giusto – Tuple

risposta

4

La vista incriminata è infatti la contentView del UITableViewHeaderFooterView (vedere Apple Docs). Quindi dovresti essere in grado di usare solo sendSubview(toBack:) per impedire che interferisca con i tocchi.

Tuttavia, sembra che in iOS9 lo UITableViewHeaderFooterView non riesca a inizializzare correttamente lo contentView se la vista viene caricata da un NIB. Sebbene la proprietà contentView non sia facoltativa, è in effetti nulla e si verifica un errore di ACCESSO BAD se si tenta di accedervi. Né puoi impostare un valore per contentView (nel codice o come presa in IB) perché è una proprietà di sola lettura (*). Quindi l'unica soluzione a cui posso pensare è di usare #available per includere in modo condizionale il codice per spostare contentView sul retro, se si utilizza iOS 10 o versioni successive. Vorrei mettere il codice in questione nella vostra sottoclasse:

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

(*) Indulgere in speculazione selvaggia, la mia ipotesi è che Apple basa il codice UITableViewHeaderFooterView pesantemente su UITableViewCell. Dal momento che IB ha UITableViewCells nella sua libreria di oggetti (e si noti che questi includono la cella contentView), può garantire che il contentView della cella sia istanziato correttamente. Ma poiché nella libreria degli oggetti non è presente il numero UITableViewHeaderFooterView, non è possibile caricare correttamente lo contentView. Sembra che l'abbiano risolto in iOS10 creando un'istanza di contentView vuota. Peccato che non abbiano aggiunto anche UITableViewHeaderFooterView alla biblioteca.

+0

ho avuto nessun problema con l'utilizzo di tuo codice con iOS9. Qualcosa di simile: - (UIView *) tableView: (UITableView *) tableView viewForHeaderInSection: (NSInteger) headerIndex { ... NSArray * pennino = [[NSBundle mainBundle] loadNibNamed ... ... [headerView sendSubviewToBack: [headerView contentView]]; ... } – Darko

+0

@Darko Interessante. Ho trovato il problema si è verificato se ho registrato il pennino e poi dequeued; Non ho provato a caricare il pennino direttamente. Ma dovrebbero usare entrambi l'inizializzatore 'init (coder:)' offendente, quindi forse ho bisogno di investigare un po 'di più. Oppure potrebbe essere collegato all'Obiettivo-C essendo più tollerante dei valori nulli. – pbasdf

+0

Possibile. L'ho provato con iOS 9 e funziona ma, per sicurezza, sto controllando anche la versione di iOS prima di usare quel codice, non fa male :) – Darko

Problemi correlati