2013-08-04 9 views
-1

Я пытаюсь добиться этого:cellForRowAtIndexPath не срабатывает. Что мне не хватает?

enter image description here

но я получаю это:

enter image description here

У меня есть вид cotroller с таблицей просмотра на нем

Это Интерфейс:

@interface LoginViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> 

@property (weak, nonatomic) IBOutlet UITableView *tblCredentials; 

@end 

Это реализация:

@interface LoginViewController() 

@end 

@implementation LoginViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.tblCredentials.delegate=self; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 2; 
} 

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    UITextField *textField = [[UITextField alloc] init]; 
    textField.enablesReturnKeyAutomatically = YES; 
    textField.autocorrectionType = UITextAutocorrectionTypeNo; 
    textField.autocapitalizationType = UITextAutocapitalizationTypeNone; 

    CGRect cellBounds = cell.bounds; 
    CGFloat textFieldBorder = 10.f; 
    CGRect aRect = CGRectMake(textFieldBorder, 9.f, CGRectGetWidth(cellBounds)-(2*textFieldBorder), 31.f); 

    textField.frame = aRect; 

    if(indexPath.row==0) 
    { 
     textField.placeholder = @"Username"; 
     textField.returnKeyType = UIReturnKeyNext; 
     textField.autocapitalizationType = UITextAutocapitalizationTypeWords; 
    } 
    else 
    { 
     textField.placeholder = @"Password"; 
     textField.returnKeyType = UIReturnKeyDone; 
     textField.secureTextEntry = YES; 
    } 

    [cell.contentView addSubview:textField]; 

    return cell; 
} 


@end 

я поставил точку останова на в cellForRowAtIndexPath и не останавливаться на достигнутом, так что эти текстовые поля не будут выданы.

Что мне не хватает?

PS: Это плохой подход к достижению цели? (эти два сгруппированных текстовых полей)

LE: Я использую stroyboard, без XIb файлов

+2

набор TableView делегат от XIB или позвоните '[self.tblCredentials reloadData]' после установки делегата в 'viewWillAppear' – samfisher

+0

было бы лучше, чтобы установить вид таблицы и DataSource делегатов гораздо раньше, например, в' -ViewDidLoad'. – holex

+0

В viewWillAppear Я установил делегат и перезагрузил данные tblCredentials, но без результата; – user2611691

ответ

0

Вы назначаете делегата вид таблицы, но не источник данных, из которого исходит количество строк и т. Д.

Вы также устанавливаете делегат немного в конце цикла. Так как это в xib, почему бы не установить делегат и источник данных в xib вместо кода? Если вы заявляете, что ваш контроллер просмотра соответствует свойствам делегата и источника данных в заголовке, вы сможете установить соединение в IB. Если вы настаиваете на его установке в коде, это должно быть в viewDidLoad.

+0

Извините, что не упомянув об этом в вопросе, я не использую xib-файлы. – user2611691

+0

Я не задал источник данных своего вида таблицы, просто делегат, и он отлично работает ... – Macro206

+0

Но у вас есть выход к tableView, и вы не делаете его в своем коде. Когда я говорю xib, я также говорю о раскадровках ... – jrturton

1

В viewDidLoad, необходимо установить делегат и вызвать [self.tblCredentials reloadData] для того, чтобы табличном на самом деле «загрузить свои данные»

+0

В viewLidLoad я устанавливаю делегат и перезагружает tblCredentials, но результат тот же. – user2611691

+0

Ох. Сожалею! Я предлагаю посмотреть ссылку Github. – Macro206

1

Вам необходимо создать пользовательскую ячейку таблицы. взгляните на это githublink.

0

Установите делегат и источник данных в -viewDidLoad и поместите [self.tblCredentials reloadData] в -viewWillAppear :.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.tblCredentials.delegate=self; 
    self.tblCredentials.dataSource=self; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // BTW, it's better to call super's -viewWillAppear: here, according to apple's documentation. 
    [self.tblCredentials reloadData]; 
} 
Смежные вопросы