2011-07-05 19 views
13

Neredeyse UITableViewCell'u UITextField ile uygulayarak bitirdim.UITextView ile UITableViewCell UITableView satırını seçme yeteneğini kaybediyor mu?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; 
    [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 
    amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; 
    amountField.placeholder = @"Enter amount"; 
    amountField.keyboardType = UIKeyboardTypeDecimalPad; 
    amountField.textAlignment = UITextAlignmentRight; 
    amountField.clearButtonMode = UITextFieldViewModeNever; 
    [amountField setDelegate:self]; 

    [[cell textLabel] setText:@"Amount"]; 
    [cell addSubview:amountField]; 
    return cell; 
} 

Sonra da diğer alanları girdi görünümler gösterilmesine izin textfield'ı istifa, didSelectRow yöntemi uygulanmaktadır: Aksine o ben o basit bir yolunu uygulamış CGRectMake içinden ve UITableViewCell.contentView gidiyor.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    [amountField resignFirstResponder]; 
    ... 
} 

Bu benim UITextField ile bir değil iken, ben alanını Yani o diğerleri Tüm hücre seçildiğinde seçildiğinde, tek şey, tablodaki diğer satır olduğunda ise sorunsuz çalışır ve Mavi döner seçilir ve metin girebilirim ancak hücre seçilmemiş. Test ettim ve problem uyumludur anladım:

[cell addSubview:amountField]; 

seçilebilir hücre davranışını kırar gibi görünüyor, hatta [cell contentView] eklemeden bu düzeltmez. Bir şey mi kaçırdım? Metin alanı EVET-userInteractionEnabled kümesi vardır ve tüm hücre dolduruyorsa

cevap

39

, hücre dokunmak dinlemek için alınamıyor. Hücrenin dokunuşlara yanıt vermesi için, metin alanının userInteractionEnabled değerini NO olarak ayarlamanız gerekir.

Düzenleme: Ve düzenlenebilir metin alanını yapmak istiyorsanız, hücre seçildiğinde, didSelectRowAtIndexPath aşağıdaki kodu ekleyin:, yöntemle

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    // get the reference to the text field 
    [textField setUserInteractionEnabled:YES]; 
    [textField becomeFirstResponder]; 
} 
+0

çalışacak bu deneyin? –

+0

Görünüşe göre değil: EmptyStack tavsiyelerini takip ettim ve [amountField setUserInteractionEnabled: NO] ayarladı; DidSelectRow yönteminin başlangıcında ve sonra [amountField setUserInteractionEnabled: YES] yalnızca seçili satır metin alanına sahip olduğunda. Seçim şimdi tamam, ama gerçekten metin girmek için satırda iki kez dokunmak zorundayım ... –

+0

@micpringle, Ofcourse. Metin alanı hücrenin tamamını doldururken metin alanına ve hücre yanıtlarına dokunamaz. – EmptyStack

6

Sen kırık değil ettik Bir alt görünüm ekleyerek bir şey yerine, UITextField UITableViewCell'in önündeki dokunuşu yakalar. Bunu, UITextField öğesinin dışına dokunarak, ancak UITableViewCell sınırları dahilinde test ederek deneyebilirsiniz ve aslında beklediğiniz gibi seçtiğini görürsünüz.

Bunu yapmak için UITextField alt sınıfını ve bir UITableView özelliği ekleyebilirsiniz. UITextField'ı başlattığınızda ve hücreye eklediğinizde özelliği ayarlayın.

amountField.tableView = tableView; 

Sonra alt sınıfta becomeFirstResponder geçersiz kılmak gerekirdi ve yöntemde UITextField ile hücre için satır almak ve daha sonra elle

- (BOOL)becomeFirstResponder 
{ 
    // Get the rect of the UITextView in the UITableView's coordinate system 
    CGRect position = [self convertRect:self.frame toView:self.tableView]; 
    // Ask the UITableView for all the rows in that rect, in this case it should be 1 
    NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:position]; 
    // Then manually select it 
    [self.tableView selectRowAtIndexPath:[indexPaths objectAtIndex:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    return YES; 
} 
+0

Kesinlikle haklısın, denedim, bu doğru. Teşekkürler. –

+0

Bu da işe yarıyor, ancak çok fazla ek kod gerektiriyorken, userInteractionEnabled = text alanı ayarlanırken aşağıdaki gibi boş bırakıldı: EmptyStack birkaç kod satırı .... en azından başka bir sorun bulana kadar :) teşekkür ederim. Yardımınız için, sorunu daha net hale getirdi. –

+0

Bu bir koruma döngüsü değil mi? 'tableView' -> 'visibleCells' ->' amountField' -> 'tableView' – jakenberg

1

İlk Şey sensin onu seçin havent, tekrar kullanılabilir hücreler kullanmıştır. Sağladığınız kodlama çok fazla belleğe neden olacaktır.

Sonraki şey, metin alanı dışındaki alana dokunarak satırı seçebilirsiniz.senin ques için

bir çözüm bu çalışacağından emin değilim senin TextField Delege

UITableViewCell *cell = (UITableViewCell *)[textField superView]; 
cell.selected=YES; //I think this will call the didSelectRowATIndex; 

yılında

olduğunu. Ama denemeye değer.

Eğer reuseIdentifier kullanmak istemiyorsanız, cellForRowAtIndexPath nedenini reuseIdentifier kullanmak için gerekli tüm
+0

Bu tablonun sadece 4 hücreden ibaret olduğu gerçeğinin yanı sıra güzel bir giriş maskesi olduğu için, bellek büyük bir sorun olmamalı, ama neden tekrar kullanılabilir hücreler kullanmadığımı söylüyorsunuz? İ yaptığını düşündüm. Şimdi çözümünüzü deneyeceğim. Teşekkürler. –

+0

Yeniden kullanılabilir konsepti yanlış anladınız sanırım .. http: //developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html ... Her neyse 4 hücre tamam ama 10'dan fazla bir satır size bir sorun verecektir. – iPrabu

+0

Elbette yanlış anlaşılmış olabilirim, ancak hücrelerin hepsinin farklı kontrolleri olduğunda hücreleri tekrar kullanmaktan kaçınılmamalıdır?Her neyse bağlantı için teşekkürler :) –

1

İlk şudur: yukarı ve aşağı zaman hücre == nil koşul koymak gerekir, böylece her zaman yeni hücre ve yeni textfields tahsis edecek bunu revize kod buradadır:

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

    UITextField *amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; 
    amountField.placeholder = @"Enter amount"; 
    amountField.keyboardType = UIKeyboardTypeDecimalPad; 
    amountField.textAlignment = UITextAlignmentRight; 
    amountField.clearButtonMode = UITextFieldViewModeNever; 
    [amountField setDelegate:self]; 
    [cell.contentView addSubview:amountField]; 
} 
[cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
[[cell textLabel] setText:@"Amount"]; 

return cell; 
} 

didSelect temsilci yöntemde sen, kalın olarak verilmektedir bu satırı ekleyin endeks yolda satır için hücrenin içinde bu

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [prevField resignFirstResponder]; 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UIView *view = [[cell.contentView subviews] lastObject]; 
    if([view isKindOfClass:[UITextField class]]{ 
    currentField = (UITextField*)view; 
    } 
    [currentField becomeFirstResponder]; 
    prevField = currentField; 
} 
+0

Guys, Kakaon en iyi uygulamaları öğretmek için çaba sarfetmek için teşekkür ederiz, ama ben sadece ilgili kodu koymak için çalıştım, miktarı her zaman, ama görünmez sadece bir bakışta yüklendi, hücre var orada ama ilgili değil çünkü ihmal edildi soruma ve tablo sadece 4 satır olduğu için kaydırmıyor. Yorumlarınızın geri kalanı da çok yararlı. Teşekkürler! –

1

gibi yapabilirsiniz

`Bu UITextField düzenlenemez hale olmaz; 10
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; 
    [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 

    amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; 
    amountField.placeholder = @"Enter amount"; 
    amountField.keyboardType = UIKeyboardTypeDecimalPad; 
    amountField.textAlignment = UITextAlignmentRight; 
    amountField.clearButtonMode = UITextFieldViewModeNever; 

    [amountField setDelegate:self]; 
    [[cell textLabel] setText:@"Amount"]; 

    **for (UIView *cellSubViews in cell.subviews) { 
      cellSubViews.userInteractionEnabled = NO; 
    }** 

    [cell addSubview:amountField]; 
    return cell; 
} 

` userInteractionEnabled = HAYIR Eğer ayarlarsanız,