2011-08-22 33 views
13

için programsal olarak ekleyerek, bir Navlun denetleyicisinin hiyerarşilerinden birine bir metin ve bazı görüntüler içerecek bir UIViewController yüklüyorum. Altta, genişletilebilir ve daraltılabilir bir tablo görünümü oluşturmak istiyorum.Bir UITableView bir UIViewController

İlk önce, bu fikir mümkün mü? Öyleyse, nasıl eklerim ve veri kaynağını ve temsilci yöntemlerini nereye yerleştiririm?

Sadece TableViewController'ın ayrı bir alt sınıfını yapabilir ve sonra ViewViewer'ım alt görünümü olarak ekleyebilir miyim?

+0

Görünüm denetleyicisine alt görünüm olarak herhangi bir şey ekleyemezsiniz, çünkü görünüm denetleyicisi bir görünüm değildir ve yalnızca görünümlerin alt görünümleri vardır. –

cevap

20

Evet, temsilci, veri kaynağı ve üst görünümünün bir UITableViewController olması gerekmeyen bir UITableView oluşturabilirsiniz. UITableView bir UIView olduğundan, bunu diğer UIView'nin alt görünümü olarak ekleyebilirsiniz. Herhangi bir NSObject, gerekli protokol yöntemlerini uyguladığınız sürece delege veya veri kaynağı olabilir.

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

Aslında, benim deneyimimde, çok fazla insan UITableViewControllers kullanmıyor. Masa görünümünden en son ne zaman kullanılabilir alanın tamamını almak istediniz? Genel olarak, sade bir UIViewController yaratıyorum ve diğer alt görünümlerin yanı sıra kendi görüşünün bir alt görünümü olarak bir UITableView ekliyorum.

+0

hey @commanda, ios geliştirme için yeni ve uiviewcontroller üzerinde bir uitableview yerleştirme düzgün bir şekilde diğer nesnelerle nasıl ekleyeceğine bakarak. Her neyse, ben bunun üzerine tökezledim ve bakabilirim bazı öğreticiler/kaynak kodları biliyor olabilirsiniz, bu yüzden nasıl çalıştığını anlayabiliyorum? Teşekkürler! – gdubs

11

Bu sizin viewDidLoad yöntemi gibi bir şey, oldukça kolay:

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

Sadece bir UITableViewController sadece kontrolörün görünüm olarak ayarlanır tableview ile UIViewController alt sınıfı olduğunu unutmayın.

Evet, kesinlikle bir tablo görünümüne sahip olmak istediğinizde ve aynı zamanda UITableViewController'ı kullanmanıza engel olan diğer özel UI öğeleri istediğinizde kesinlikle kullanılabilir ve çok sık kullanılır.

Normalde, onu benim normalize etme yöntemim veya viewDidLoad yönteminde görünüm denetleyicimin görünümüne eklemeyi tercih ederim. Bu, görünümlerinizi bir NIB'den oluşturuyor veya tamamen programlı olarak oluşturmanıza bağlı olarak değişecektir. NIBs durumunda

:

- (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]; 
    } 
} 

Ve sonra viewDidLoad stilini tableview çerçevesini ayarlayabilirsiniz.

Arayüz oluşturucudaki her şeyi, aynı sonucu elde etmek için daha az kod ile elde etmeyi tercih ediyorum.

+0

IB kullanımının "daha az kod" ile nasıl sonuçlanacağını merak ediyorum. Bunu tamamen kod içinde yapmak, initWithNibName: bundle: 'basit bir 'init' olarak değiştirilecekti - ama başka bir şey değişecek mi? –

+1

'Veri kaynağı', 'dataSource' olmalıdır. –

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

sen de benim gibi ve zaten bir UITableViewController yaratmıştı ve o zaman bir ağrı olurdu yeniden yazarak bunun üzerinde çok fazla çalışma yaptı fark varsa, UITableViewController eklemek için aşağıdaki tıpkı yapabilirsiniz bir alt görünüm olarak UIViewController.

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

Yukarıdaki tüm diğer yanıtlar harika çalışıyor. Ben bir UITableViewController ağır yatırımlanmış bir uygulama var ve refactoring bir acı olacağını hissediyorum olanlar için buna ekleyeceğimi düşünüyorum.

+0

Bu şekilde bile tercih ederim - Masa Denetleyici bu şekilde Görünüm Kontrolöründen ayrılır. – Tommz