2015-07-13 11 views
6

Próbuję dodać przycisk ontop widoku tabeli kontrolera uitableview. Kontroler widoku ma kontroler nawigacji i komórki statyczne, dlatego jest to kontroler uitableviewcontroller, a nie kontroler uiviewcontroller. Teraz próbuję dodać przycisk na dole ekranu, który jest dołączony do kontrolera nawigacyjnego, aby nie przewijał widoku tabeli.Dodaj przycisk na UITableViewController (Swift)

Próbuję zrobić coś podobnego do tego, co poniżej. Ma kontroler nawigacji dla górnego paska, widok tabeli z komórkami statycznymi, a następnie przycisk, ale jak oni zrobili przycisk?

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

Dzięki!

AKTUALIZACJA: Jak mogę użyć kontrolera interfejsu użytkownika uiview z widokiem tabeli w komórkach statycznych za pomocą Swift?

Odpowiedz

-1

Oto UIViewController, z UITableView dodany jako wyeksportowany. W prawym górnym rogu znajduje się menu Treści: Dynamiczne prototypy. Zmień go na Static Cells. enter image description here

+1

nie sądzę, że będzie działać, bo Muszę użyć znacznika uitableview, ponieważ potrzebuję komórek statycznych i nie można zmienić jego wysokości za pomocą tableviewcontroller. – zach

+0

Możesz użyć zwykłego kontrolera UIViewController lub UINavigationController i samemu dodać widok tabeli. To sprawia, że ​​jest o wiele bardziej elastyczny. – pranjalsatija

+0

To podejście, które stosuję we wszystkich moich aplikacjach. Używam UIViewController i dodam widok tabeli jako widok subview, więc mogę zmienić jego rozmiar, jednak chciałbym. A jeśli chcesz używać statycznych komórek, nadal możesz. – pranjalsatija

1

Sterownik UITableViewController zajmie całe miejsce, więc nie będzie można dodać przycisku. Zmodyfikuj swój kod oparty na UITableViewController na UIViewController z ręcznie dodanym UITableView. W ten sposób będziesz mógł ustawić rozmiar widoku tabeli i umieścić przycisk na dole.

4

Zrobiłem coś podobnego z UITableViewController i statycznym źródłem danych. Dodałem przycisk w stopce widoku mojego tableview.

Aby to wyrównać do dołu ekranu Musiałem ten kod w moim 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 
    } 

w skrócie, zmianie rozmiaru footerview wziąć całą pozostałą przestrzeń po contentSize widoku tabeli jest usunięty. Ponieważ przycisk jest wyrównany do dolnej części footerView z autolayout, pozostanie na dole ekranu.

serii ujęć:

Storyboard

Oto wynik:

simulator

+0

Czy możesz mi powiedzieć, jak to zrobić szybko, ponieważ próbuję to zrobić, ale wszystko, co pokazuje, to: http://postimg.org/image/pl81087ix/ – zach

+0

Edytowałem swoją odpowiedź. – knutigro

+0

i pamiętaj, aby połączyć footerView przy użyciu IBOutlet – knutigro

10

znajdę Pojemnik Widoki bardzo przydatny w tym scenariuszu! Czyste rozwiązanie i bardzo łatwe do wdrożenia.

Po prostu utwórz zwykły kontroler UIViewController, dodaj przycisk i ContainerView jako subviews tego UIViewController (środkowy na obrazku poniżej). Na koniec utwórz Segmentuj Segment z ContainerView do swojego UITableViewController (ten po prawej).

Storyboard

W ten sposób można używać statycznych prototypy komórkowych, nie ograniczając się tylko do UITableView w tym samym czasie.

Wynik:

Result

+0

Zajęło mi trochę czasu, aby dowiedzieć się, jak wdrożyć to, co sugerujesz, ale w rzeczywistości jest to prostsze i bardziej przenośne, bez kodu. – yeyo

0

Niestety UITableViewController posiada tableView jako widok z góry poziomu. Oczywiście, jeśli spojrzysz w widoku debuggera, zobaczysz, że widok tabeli nie jest widokiem głównym. Dzięki temu programowo można dodawać przyciski do okna tableView. Jeśli musisz to zrobić po fakcie, jest to prawdopodobnie najłatwiejszy sposób dodania elementu najwyższego poziomu do kontrolera UITableViewController. W przeciwnym razie, jeśli robisz to w pierwotnym projekcie, możesz użyć widoku kontenera dla swoich przycisków i kontrolki UITableViewController dla TableView. Minusem tego podejścia jest to, że otrzymujesz dwa kontrolery widoku, jeden dla kontenera i jeden dla tabeli, i często jest to konieczne, aby przekazać informacje z powrotem i między nimi. Jeśli używasz szybkiego, możesz to uprościć, zagnieżdżając tableViewcontroller wewnątrz klasy kontrolera widoku kontenera.

Jeśli chcesz dodać przycisk do okna, możesz to zrobić leniwie, gdy masz pewność, że widok ma okno. Zauważ, że przyciski należą do okna, a nie do kontrolera widoku, więc masz obowiązek usunąć je, gdy zniknie kontroler widoku.

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

istnieje lepsze rozwiązanie tego problemu. można to zrobić poprzez wyłączenie układu Auto (button.translatesAutoresizingMaskIntoConstraints = false) własność odpowiedni przycisk lub UIView dla pływających przycisku:

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 
} 
Powiązane problemy