2015-07-13 3 views
6

Sto provando ad aggiungere un pulsante ontop di una vista tabella del controller uitableview. Il controller della vista ha un controller di navigazione e celle statiche, motivo per cui è un controllore uitableview e non un controllore uiview. Ora sto cercando di aggiungere un pulsante nella parte inferiore dello schermo che è collegato al controller di navigazione in modo che non scorra con la vista tabella.Pulsante Aggiungi in cima a UITableViewController (Swift)

Sto cercando di creare qualcosa di simile a ciò che è sotto. Ha un controller di navigazione per la barra superiore, una vista tabella con celle statiche e poi un pulsante, ma come hanno fatto il pulsante?

Image: http://postimg.org/image/ilsmqqrip/

Grazie!

AGGIORNAMENTO: come è possibile utilizzare un controllore uiview con una vista tabella con celle statiche utilizzando Swift?

risposta

-1

Ecco un UIViewController, con UITableView aggiunto come sottoview. In alto a destra, puoi vedere un menu a discesa che dice Content: Dynamic Prototypes. Cambiarlo in celle statiche. enter image description here

+1

non credo che funzionerà perché io è necessario utilizzare uitableviewcotroller perché ho bisogno di celle statiche e non è possibile modificarne l'altezza con un tableviewcontroller. – zach

+0

È possibile utilizzare un normale UIViewController o un UINavigationController e aggiungere personalmente la vista tabella. Questo lo rende molto più flessibile. – pranjalsatija

+0

Questo è l'approccio che prendo in tutte le mie app. Io uso un UIViewController e aggiungo la vista tabella come sottoview, quindi posso cambiare le sue dimensioni come vorrei. E se vuoi usare le celle statiche, puoi ancora. – pranjalsatija

1

UITableViewController occuperà tutto lo spazio, quindi non sarà possibile aggiungere il pulsante. Riforma il tuo codice basato su UITableViewController in UIViewController con UITableView aggiunto manualmente. In questo modo sarai in grado di impostare la dimensione della tua vista tabella e mettere il pulsante in fondo.

4

Ho eseguito un'operazione simile con UITableViewController e un'origine dati statica. Ho aggiunto il pulsante nella footview del mio tableview.

Per rendere più adeguamento alla parte inferiore dello schermo avevo bisogno di questo codice nel mio viewcontroller:

override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     // Make footerview so it fill up size of the screen 
     // The button is aligned to bottom of the footerview 
     // using autolayout constraints 
     self.tableView.tableFooterView = nil 
     self.footerView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.tableView.frame.size.height - self.tableView.contentSize.height - self.footerView.frame.size.height) 
     self.tableView.tableFooterView = self.footerView 
    } 

Insomma, ridimensiono il footerview a prendere tutto lo spazio che rimane dopo la contentSize della vista tabella è rimosso. Poiché il pulsante è allineato alla parte inferiore del footerView con l'autolayout, rimarrà nella parte inferiore dello schermo.

Lo Storyboard:

Storyboard

Ecco il risultato:

simulator

+0

Puoi dirmi come farlo in fretta, perché sto provando a farlo ma tutto ciò che mostra è questo: http://postimg.org/image/pl81087ix/ – zach

+0

Ho modificato la mia risposta. – knutigro

+0

e ricorda di connettere il footerView usando un IBOutlet – knutigro

10

trovo Container Visto molto utile in questo scenario! Una soluzione pulita e molto facile da implementare.

Basta creare un normale UIViewController, aggiungere il pulsante e un ContainerView come subviews di questo UIViewController (quello centrale nell'immagine seguente). Infine crea Embed Segue da ContainerView sul tuo UITableViewController (quello a destra).

Storyboard

In questo modo è possibile utilizzare i prototipi di celle statiche, non essere limitato solo al UITableView allo stesso tempo.

Risultato:

Result

+0

Mi ci è voluto un po 'per capire come implementare ciò che hai suggerito, ma in effetti è più semplice e portabile, nessun codice necessario. – yeyo

0

Purtroppo UITableViewController ha una tableView come suo punto di vista di primo livello. Ovviamente se si guarda nella vista del debugger si può vedere che la tableview non è la vista radice. Pertanto è possibile aggiungere i pulsanti alla finestra di tableView in modo programmatico. Se devi farlo dopo il fatto, questo è probabilmente il modo più semplice per aggiungere un elemento di livello superiore su un UITableViewController. Altrimenti, se lo stai facendo nella progettazione iniziale, puoi utilizzare la visualizzazione contenitore per i pulsanti e un UITableViewController per TableView. Lo svantaggio di questo approccio è che si ottengono due controller di visualizzazione, uno per il contenitore e uno per il tavolo e spesso necessario per passare le informazioni indietro e tra di esse. Se si utilizza Swift, è possibile semplificare questo nidificando il TableViewcontroller all'interno della classe del controller della vista del contenitore.

Se si desidera aggiungere un pulsante alla finestra, è possibile farlo pigramente una volta verificato che la vista ha una finestra. Si noti che i pulsanti appartengono alla finestra e non al controller della vista, quindi è responsabilità dell'utente rimuoverli quando il controller della vista scompare.

private weak var button: UIButton! 
    ... 
    override func didMove(toParentViewController parent: UIViewController?) { 
     super.didMove(toParentViewController: parent) 
     guard self.button == nil, let window = tableView.window else { 
      return 
     } 
     let button = UIButton(frame: CGRect(x:0, y:40, width: 200, height: 20)) 
     button.setTitle("This is a red button", for: .normal) 
     button.backgroundColor = UIColor.red 
     window.addSubview(button) 
     self.button = button 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     button?.removeFromSuperview() 
    } 
0

c'è una soluzione migliore per questo. si può fare questo disabilitando l'Auto Layout (button.translatesAutoresizingMaskIntoConstraints = false) di proprietà del pulsante corrispondente o qualsiasi UIView per il tasto flottante:

Swift 4

//create a button or any UIView and add to subview 
let button=UIButton.init(type: .system) 
button.setTitle("NEXT", for: .normal) 
let button.frame.size = CGSize(width: 100, height: 50) 
self.view.addSubview(nextButton) 

//set constrains 
button.translatesAutoresizingMaskIntoConstraints = false 
if #available(iOS 11.0, *) { 
    button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true 
    button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true 
} else { 
    button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true 
    button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true 
}