2011-08-22 16 views
13

Załaduję kontroler UIViewController do jednej z hierarchii kontrolerów Nav, która będzie zawierać tekst i niektóre obrazy. U dołu chcę utworzyć rozwijany i składany widok tabeli.Dodawanie programowo UITableView do kontrolera UIViewController

Po pierwsze, czy ten pomysł jest możliwy? Jeśli tak, to jak mogę go dodać i gdzie umieścić źródło danych i przekazywać metody?

Czy mogę po prostu utworzyć oddzielną podklasę TableViewController, a następnie dodać ją do mojego ViewController jako subview?

+0

Nie możesz dodać niczego do kontrolera widoku jako widoku podrzędnego, ponieważ kontroler widoku nie jest widokiem, a tylko widoki mają widoki podrzędne. –

Odpowiedz

20

Tak, można utworzyć UITableView, którego delegat, źródło danych i widok nadrzędny niekoniecznie są kontrolerami UITableViewController. Ponieważ UITableView jest UIView, możesz dodać go jako widok z dowolnego innego UIView. Każdy NSObject może być delegatem lub źródłem danych, o ile implementujesz wymagane metody protokołu.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

W rzeczywistości, z mojego doświadczenia, niewielu ludzi korzysta nawet z UITableViewControllers. Kiedy ostatni raz chciałeś, aby Twój widok tabeli zajmował całą przestrzeń użytkową? Generalnie, tworzę zwykły stary UIViewController i dodam UITableView jako wyeksponowanie jego widoku, oprócz innych subviews.

+0

hey @ komenda, jestem nowy w rozwoju ios i szukają sposobu, aby poprawnie zaimplementować wstawianie uitable widok w uiviewcontroller z innymi obiektami na nim. W każdym razie natknąłem się na to i zastanawiałem się, czy możesz znać kilka tutoriali/kodu źródłowego, na który mogę patrzeć, więc mogę zrozumieć, jak to działa? Dzięki! – gdubs

11

Jest to dość proste, w czymś w rodzaju metodę viewDidLoad:

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
[self.view addSubview:tableView]; 
4

Wystarczy pamiętać, że UITableViewController jest podklasą UIViewController tylko z tableview ustawiony jako widok kontrolera.

Tak, zdecydowanie możliwe i często używane, jeśli chcesz mieć widok tabeli, ale także inne niestandardowe elementy interfejsu użytkownika, które uniemożliwiają użycie kontrolki UITableViewController.

Zazwyczaj wybrałbym dodanie go do widoku kontrolera widoku zarówno metodą inicjalizacji, jak i metody viewDidLoad. To zależy od tego, czy tworzysz swoje poglądy z NIB, czy w pełni programowo.

W przypadku stalówki:

- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName 
{ 
    if ((self = [super initWitNibName:nibName bundle:bundleName])) 
    { 
     self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere]; 
     theTableView.dataSource = self, theTableView.delegate = self; 
     [self.view addSubview:theTableView]; 
     [theTableView release]; 
    } 
} 

A potem można ustawić ramkę swojego tableview w swoim sposobie viewDidLoad.

Osobiście wolałbym zrobić wszystko w programie do budowania interfejsów, ponieważ uzyskałby taki sam wynik, a jednocześnie mniej kodu do utrzymania.

+0

Ciekawi mnie, w jaki sposób użycie IB spowoduje "mniej kodu". Wykonując to całkowicie w kodzie, zmienna 'initWithNibName: bundle:' zostanie zmieniona na prostą 'init' - ale czy cokolwiek innego zmieniłoby się? –

+1

Myślę, że "datasource" powinno być "DataSource" –

15
/************************************************/ 
/************* MyCustomController.m *************/ 
/************************************************/ 

@interface MyCustomController() <UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@end 

@implementation MyCustomController 

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName 
{ 
    self = [super initWitNibName:nibName bundle:bundleName]; 
    if (self) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
     tableView.datasource = self; 
     tableView.delegate = self; 
     [self.view addSubview:self.tableView]; 
    } 

    return self; 
} 

#pragma mark - UITableViewDataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return number of rows 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return cell 
} 

#pragma mark - UITableViewDelegate Methods 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // handle table view selection 
} 

@end 
2

Jeśli jesteś podobny do mnie i już stworzył UITableViewController a następnie wiedząc, że zrobiłeś tyle pracy na nim, że ponowne pisanie byłoby uciążliwe, można po prostu wykonaj następujące czynności, aby dodać UITableViewController do UIViewController jako subview.

UITableViewController* tableViewController = [[UITableViewController alloc] init]; 
[self.view addSubview:tableViewController.tableView]; 

Wszystkie pozostałe odpowiedzi powyżej działają świetnie. Myślę, że dodałbym do tego dla tych, którzy mają mocno zainwestowaną implementację UITableViewController i czuję, że refactoring byłby bólem.

+0

Wolałbym nawet w ten sposób - Kontroler tabel jest w ten sposób ładnie oddzielony od kontrolera widoku. – Tommz

Powiązane problemy