UITableViewCell'de bir UITextField'a sahip olmak


178

Bunu birkaç günlüğüne yapmaya çalışıyorum ve bunu yapmaya çalışan insanların tonlarca mesajını okuduktan sonra , bu örnekte olduğu gibi hala UITextFieldbazılarımda tam olarak çalışamıyorum UITableViewCells:

Ekran görüntüsü

Ya form çalışıyor, ancak metin görünmüyor (rengini maviye ayarlamış olmama rağmen), tıkladığımda klavye sahada devam ediyor ve klavye olaylarını doğru bir şekilde uygulayamadım. Apple'dan bir grup örnekle denedim (esas olarak UICatalog, benzer bir kontrolün olduğu yerde), ancak yine de düzgün çalışmıyor.

Birisi bana (ve bu kontrolü gerçekleştirmeye çalışan tüm insanlara) yardımcı olabilir ve basit bir uygulama olan bir UITextFieldin a'nın basit bir uygulamasını UITableViewCellyayınlayabilir mi?


Çalıştırdım. Ama sadece birkaç alan için. Tabloda birden fazla alan olduğunda veya yalnızca bir alanınız olduğunda sorunla mı karşılaşıyorsunuz?
PEZ

Sadece 2 tarlada çalışmasına ihtiyacım var ... Bir tarla denesem bile şu an işe yaramıyor. Çalışan uygulamanızı gönderebilir misiniz? Teşekkür ederim PEZ!
Mathieu

EditableDetailView örneğini denediniz mi? Henüz cevaplar hakkında yorum yapamayacağınız için soruyu da buraya yazın
PEZ

selam arkadaşlar tableview çoklu metin alanı eklemek mümkündür stackoverflow.com/questions/19621732/…
Siva

2
Web'deki tüm cevaplar neden kayboluyor CGRectMake(A_MAGIC_NUMBER, ANOTHER_MAGIC_NUMBER, YET_ANOTHER_HARDCODED_MAGIC_NUMBER, OH_HERES_ANOTHER_MYSTERIOUS_HARDCODED_MAGIC_NUMBER)? Bu sayılar nereden geliyor?
jameshfisher

Yanıtlar:


222

Bunu deneyin. Benim için cazibe gibi çalışıyor (iPhone cihazlarda). Bir kez giriş ekranı için bu kodu kullandım. Tablo görünümünü iki bölüm olacak şekilde yapılandırdım. Tabii ki bölüm koşullarından kurtulabilirsiniz.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                   reuseIdentifier:kCellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryNone;

    if ([indexPath section] == 0) {
        UITextField *playerTextField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
        playerTextField.adjustsFontSizeToFitWidth = YES;
        playerTextField.textColor = [UIColor blackColor];
        if ([indexPath row] == 0) {
            playerTextField.placeholder = @"example@gmail.com";
            playerTextField.keyboardType = UIKeyboardTypeEmailAddress;
            playerTextField.returnKeyType = UIReturnKeyNext;
        }
        else {
            playerTextField.placeholder = @"Required";
            playerTextField.keyboardType = UIKeyboardTypeDefault;
            playerTextField.returnKeyType = UIReturnKeyDone;
            playerTextField.secureTextEntry = YES;
        }       
        playerTextField.backgroundColor = [UIColor whiteColor];
        playerTextField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        playerTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        playerTextField.textAlignment = UITextAlignmentLeft;
        playerTextField.tag = 0;
        //playerTextField.delegate = self;

        playerTextField.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [playerTextField setEnabled: YES];

        [cell.contentView addSubview:playerTextField];

        [playerTextField release];
    }
}
if ([indexPath section] == 0) { // Email & Password Section
    if ([indexPath row] == 0) { // Email
        cell.textLabel.text = @"Email";
    }
    else {
        cell.textLabel.text = @"Password";
    }
}
else { // Login button section
    cell.textLabel.text = @"Log in";
}
return cell;    
}

Sonuç şuna benzer:

Giriş Formu


1
Neredeyse aynı şeyi deniyorum. Ancak, metin alanı yalnızca satır seçildiğinde görünür. Aksi takdirde hiç çizilmez. Yukarıdaki örnekte sadece etiketi alıyorum, yani Login. Bu, iPad'de iOS 4.2 ile.
David

3
Aslında daha da iyi bir soru: Bir sonraki / geri dönüş klavye etkinliğini nasıl ele alıyorsunuz?
Rob

3
@Rob: Verilere olaylar aracılığıyla ulaşabilirsiniz. Ben editingDidEnd olaya UITextField içeriğini şöyle kurmak yakala: [_field addTarget:self action:@selector(editingEnded:) forControlEvents:UIControlEventEditingDidEnd];.
Corey Larson

7
UITextField öğesini, hücrenin kendisini değil, cell.contentView öğesinin bir alt görünümü olarak eklemeniz gerekir.
Mark Adams

6
[cell addSubview:playerTextField];İOS 5.0+ ile çalışmasını sağlamak için kullanın .
Stunner

47

İşte iOS6 / 7/8/9 altında iyi görünen bir çözüm .

Güncelleme 2016-06-10: bu hala iOS 9.3.3 ile çalışıyor

Tüm desteğiniz için teşekkürler, bu artık https://github.com/fulldecent/FDTextFieldTableViewCell adresinde CocoaPods / Carthage / SPM'de

Temel olarak stoğu alıyoruz UITableViewCellStyleValue1ve olması gerektiği UITextFieldyerde detailTextLabelzımbalıyoruz. Bu bize tüm senaryolar için otomatik yerleştirme sağlar: iOS6 / 7/8/9, iPhone / iPad, Görüntü / Görüntü Yok, Aksesuar / Aksesuar Yok, Portre / Manzara, 1x / 2x / 3x.

resim açıklamasını buraya girin

Not: Bu, UITableViewCellStyleValue1"word" adlı bir tür hücreye sahip film şeridi kullanıyor .

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell = [tableView dequeueReusableCellWithIdentifier:@"word"];
    cell.detailTextLabel.hidden = YES;
    [[cell viewWithTag:3] removeFromSuperview];
    textField = [[UITextField alloc] init];
    textField.tag = 3;
    textField.translatesAutoresizingMaskIntoConstraints = NO;
    [cell.contentView addSubview:textField];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:cell.textLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1 constant:8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeBottom multiplier:1 constant:-8]];
    [cell addConstraint:[NSLayoutConstraint constraintWithItem:textField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:cell.detailTextLabel attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]];
    textField.textAlignment = NSTextAlignmentRight;
    textField.delegate = self;
    return cell;
}

2
Bu cevabı görmek için yukarıdaki oy dağlarında ilerlediğiniz için teşekkürler!
William Entriken

1
By UITableViewCellStyleRightDetaildemek istiyorsun UITableViewCellStyleValue1?
ma11hew28

1
Maalesef konsoldaki metin duvarı ile 'Eşzamanlı olarak kısıtlamalar sağlanamıyor' atar.
dreamzor

Ayrıca, cell.detailTextLabel öğesi gizli olarak ayarlanırsa, sağ ('sondaki') tarafını hiç hizalamaz.
dreamzor

Bu, benimle hikaye panosu kullanarak çöküyor. Bunu storyboard ile kullanabilir misiniz?
Siriss

23

İşte bunu nasıl başardım:

TextFormCell.h

#import <UIKit/UIKit.h>

#define CellTextFieldWidth 90.0
#define MarginBetweenControls 20.0

@interface TextFormCell : UITableViewCell {
 UITextField *textField;
}

@property (nonatomic, retain) UITextField *textField;

@end

TextFormCell.m

#import "TextFormCell.h"

@implementation TextFormCell

@synthesize textField;

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
  // Adding the text field
  textField = [[UITextField alloc] initWithFrame:CGRectZero];
  textField.clearsOnBeginEditing = NO;
  textField.textAlignment = UITextAlignmentRight;
  textField.returnKeyType = UIReturnKeyDone;
  [self.contentView addSubview:textField];
    }
    return self;
}

- (void)dealloc {
 [textField release];
    [super dealloc];
}

#pragma mark -
#pragma mark Laying out subviews

- (void)layoutSubviews {
 CGRect rect = CGRectMake(self.contentView.bounds.size.width - 5.0, 
        12.0, 
        -CellTextFieldWidth, 
        25.0);
 [textField setFrame:rect];
 CGRect rect2 = CGRectMake(MarginBetweenControls,
       12.0,
         self.contentView.bounds.size.width - CellTextFieldWidth - MarginBetweenControls,
         25.0);
 UILabel *theTextLabel = (UILabel *)[self textLabel];
 [theTextLabel setFrame:rect2];
}

Biraz ayrıntılı görünebilir, ama işe yarıyor!

Delege kurmayı unutmayın!


16

Bunu dene. Kaydırmayı da yönetebilir ve daha önce eklediğiniz alt görünümleri kaldırma zahmetine girmeden hücreleri yeniden kullanabilirsiniz.

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

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

    cell.textLabel.text = [[NSArray arrayWithObjects:@"First",@"Second",@"Third",@"Forth",@"Fifth",@"Sixth",@"Seventh",@"Eighth",@"Nineth",@"Tenth",nil] 
                           objectAtIndex:indexPath.row];

    if (indexPath.row % 2) {
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 21)];
        textField.placeholder = @"Enter Text";
        textField.text = [inputTexts objectAtIndex:indexPath.row/2];
        textField.tag = indexPath.row/2;
        textField.delegate = self;
        cell.accessoryView = textField;
        [textField release];
    } else
        cell.accessoryView = nil;

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;        
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    [inputTexts replaceObjectAtIndex:textField.tag withObject:textField.text];
    return YES;
}

- (void)viewDidLoad {
    inputTexts = [[NSMutableArray alloc] initWithObjects:@"",@"",@"",@"",@"",nil];
    [super viewDidLoad];
}

Bu snippet'te bir yerde [inputTexts sürümü] eksik mi? Muhtemelen viewDidUnload yönteminde, aksi takdirde bir bellek sızıntısı vardır.
Tim Potter

Eski yazı ama ... Metin kutusunun yazı tipini küçültemiyorum. Mümkün mü?
Schultz9999

1
Birisi bir Swift snippet çözümü sağlayabilir mi?
Kaptain

14

Bu zor olmamalı. Tablonuz için bir hücre oluştururken, hücrenin içerik görünümüne bir UITextField nesnesi ekleyin

UITextField *txtField = [[UITextField alloc] initWithFrame....]
...
[cell.contentView addSubview:txtField]

UITextField temsilcisini kendiniz olarak ayarlayın (örneğin, görünüm denetleyiciniz) Delege yöntemlerinizde hangi metin alanının düzenlendiğini tanımlayabilmeniz için metin alanına bir etiket verin. Kullanıcı metin alanına dokunduğunda klavye açılmalıdır. Böyle çalışmasını sağladım. Umarım yardımcı olur.


Bu çözümü beğendim. Metin alanınızı CGRectZeroçerçeve olarak önceden ayarladıysanız, görünüm hiyerarşisine eklemeden önce metin alanınızın çerçevesini ayarladığınızdan emin olun. Hücrenin içerik görünümünün frameözelliğini almak, özellikle böyle bir görev için yararlıdır.
Ben Kreeger

11

ayrıntılar

  • Xcode 10.2 (10E125), Swift 5

Tam Örnek Kod

TextFieldInTableViewCell

import UIKit

protocol TextFieldInTableViewCellDelegate: class {
    func textField(editingDidBeginIn cell:TextFieldInTableViewCell)
    func textField(editingChangedInTextField newText: String, in cell: TextFieldInTableViewCell)
}

class TextFieldInTableViewCell: UITableViewCell {

    private(set) weak var textField: UITextField?
    private(set) weak var descriptionLabel: UILabel?

    weak var delegate: TextFieldInTableViewCellDelegate?

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupSubviews()
    }

    private func setupSubviews() {
        let stackView = UIStackView()
        stackView.distribution = .fill
        stackView.alignment = .leading
        stackView.spacing = 8
        contentView.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.topAnchor.constraint(equalTo: topAnchor, constant: 6).isActive = true
        stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -6).isActive = true
        stackView.leftAnchor.constraint(equalTo: leftAnchor, constant: 16).isActive = true
        stackView.rightAnchor.constraint(equalTo: rightAnchor, constant: -16).isActive = true

        let label = UILabel()
        label.text = "Label"
        stackView.addArrangedSubview(label)
        descriptionLabel = label

        let textField = UITextField()
        textField.textAlignment = .left
        textField.placeholder = "enter text"
        textField.setContentHuggingPriority(.fittingSizeLevel, for: .horizontal)
        stackView.addArrangedSubview(textField)
        textField.addTarget(self, action: #selector(textFieldValueChanged(_:)), for: .editingChanged)
        textField.addTarget(self, action: #selector(editingDidBegin), for: .editingDidBegin)
        self.textField = textField

        stackView.layoutSubviews()
        selectionStyle = .none

        let gesture = UITapGestureRecognizer(target: self, action: #selector(didSelectCell))
        addGestureRecognizer(gesture)
    }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
}

extension TextFieldInTableViewCell {
    @objc func didSelectCell() { textField?.becomeFirstResponder() }
    @objc func editingDidBegin() { delegate?.textField(editingDidBeginIn: self) }
    @objc func textFieldValueChanged(_ sender: UITextField) {
        if let text = sender.text { delegate?.textField(editingChangedInTextField: text, in: self) }
    }
}

ViewController

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?
    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }
}

extension ViewController {

    func setupTableView() {

        let tableView = UITableView(frame: .zero)
        tableView.register(TextFieldInTableViewCell.self, forCellReuseIdentifier: "TextFieldInTableViewCell")
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = UITableView.automaticDimension
        tableView.tableFooterView = UIView()
        self.tableView = tableView
        tableView.dataSource = self

        let gesture = UITapGestureRecognizer(target: tableView, action: #selector(UITextView.endEditing(_:)))
        tableView.addGestureRecognizer(gesture)
    }
}

extension ViewController: UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2 }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldInTableViewCell") as! TextFieldInTableViewCell
        cell.delegate = self
        return cell
    }
}

extension ViewController: TextFieldInTableViewCellDelegate {

    func textField(editingDidBeginIn cell: TextFieldInTableViewCell) {
        if let indexPath = tableView?.indexPath(for: cell) {
            print("textfield selected in cell at \(indexPath)")
        }
    }

    func textField(editingChangedInTextField newText: String, in cell: TextFieldInTableViewCell) {
        if let indexPath = tableView?.indexPath(for: cell) {
            print("updated text in textfield in cell as \(indexPath), value = \"\(newText)\"")
        }
    }
}

Sonuç

resim açıklamasını buraya girin


9

[cell.contentView bringSubviewToFront:textField]Hücrelerim her göründüğünde çalıştırmak için bir yöntem çağırarak bundan kaçınıyordum , ancak daha sonra bu nispeten basit tekniği keşfettim:

cell.accessoryView = textField;

Aynı arka plan aşırı-paspas sorununa sahip gibi görünmüyor ve kendi başına (bir şekilde) hizalanıyor. Ayrıca, textLabel, içine taşmasını (veya altında) önlemek için otomatik olarak kısalır, bu da kullanışlıdır.


Onu geri alıyorum .. Bana hiç benzemiyor. = (
Henley Chiu

10
Hisoka-- ne oldu?
Ben Mosher

4

Ben de aynı problemle karşılaştım. cell.textlabel.textÖzelliği ayarlamak, UILabel'ı hücrenin contentView öğesinin önüne getiriyor gibi görünüyor . Ayardan sonra textView öğesini ekleyin textLabel.textveya (bu mümkün değilse) şunu çağırın:

[cell.contentView bringSubviewToFront:textField]

2

İPad'de bu görevle gerçekten mücadele ettim, metin alanları UITableView'da görünmez görünüyor ve odak alındığında tüm satır maviye dönüyor.

Sonunda benim için işe yarayan, Apple'ın Tablo Görünümü Programlama Kılavuzu'ndaki "Statik Satır İçeriği Tekniği" altında açıklanan teknikti . Görünüm için NIB bir UITableViewCell hem etiket hem de textField koydu ve bir çıkış yoluyla bu hücre dışarı çekin cellForRowAtIndexPath:. Ortaya çıkan kod UICatalog'dan çok daha temiz.


1

İşte nasıl yapılır doğru yolu inanıyorum. Test ettiğim gibi Ipad ve Iphone'da çalışıyor. Bir uitableviewcell sınıflayarak kendi customCells oluşturmak gerekir:

interfaceBuilder'da başlayın ... yeni bir UIViewcontroller oluşturun customCell deyin (oradayken bir xib için gönüllü olun) customCell'in uitableviewcell'in bir alt sınıfı olduğundan emin olun

şimdi tüm görünümleri silmek ve tek bir hücre boyutu yapmak bir görünüm oluşturmak. o görünümü alt sınıf customcell yapın. şimdi iki görünüm daha oluşturun (ilkini çoğaltın).
Bağlantı denetçinize gidin ve şimdi bu görünümlere bağlayabileceğiniz 2 IBOutlet bulun.

-backgroundView -SelectedBackground

bunları kopyaladığınız son iki görünüme bağlayın ve onlar hakkında endişelenmeyin. customCell'i genişleten ilk görünüm, etiketinizi ve uitextfield'ı içine yerleştirin. customCell.h girdim ve etiketinizi ve metin alanınızı bağlayın. Bu görünümün yüksekliğini, tamamlandı 75 (her hücrenin yüksekliği) olarak ayarlayın.

CustomCell.m dosyanızda, yapıcı şunun gibi göründüğünden emin olun:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
    NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"       owner:self options:nil]; 
    self = [nibArray objectAtIndex:0];
}
return self;
}

Şimdi bir UITableViewcontroller oluşturun ve bu yöntemde customCell sınıfını şu şekilde kullanın:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
// lets use our customCell which has a label and textfield already installed for us

customCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    //cell = [[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


    NSArray *topLevelsObjects = [[NSBundle mainBundle] loadNibNamed:@"NewUserCustomCell" owner:nil options:nil];
    for (id currentObject in topLevelsObjects){
        if ([currentObject  isKindOfClass:[UITableViewCell class]]){
            cell = (customCell *) currentObject;
            break;
        }
    }

    NSUInteger row = [indexPath row];

switch (row) {
    case 0:
    {

        cell.titleLabel.text = @"First Name"; //label we made (uitextfield also available now)

        break;
    }


        }
return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 75.0;
}

0

İşte bir drop-in alt sınıf için olduğunu UITableViewCelldeğiştirir hangi detailTextLabel düzenlenebilir ile UITextField(durumunda veya UITableViewCellStyleDefaultyerini TextLabel ). Bu, tüm tanıdık UITableViewCellStyles, accessoriesViews, vb yeniden kullanmanızı sağlayan avantajı var, şimdi ayrıntı düzenlenebilir!

@interface GSBEditableTableViewCell : UITableViewCell <UITextFieldDelegate>
@property UITextField *textField;
@end

@interface GSBEditableTableViewCell ()
@property UILabel *replace;
@end

@implementation GSBEditableTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _replace = (style == UITableViewCellStyleDefault)? self.textLabel : self.detailTextLabel;
        _replace.hidden = YES;

        // Impersonate UILabel with an identical UITextField
        _textField = UITextField.new;
        [self.contentView addSubview:_textField];
        _textField.translatesAutoresizingMaskIntoConstraints = NO;
        [_textField.leftAnchor constraintEqualToAnchor:_replace.leftAnchor].active = YES;
        [_textField.rightAnchor constraintEqualToAnchor:_replace.rightAnchor].active = YES;
        [_textField.topAnchor constraintEqualToAnchor:_replace.topAnchor].active = YES;
        [_textField.bottomAnchor constraintEqualToAnchor:_replace.bottomAnchor].active = YES;
        _textField.font = _replace.font;
        _textField.textColor = _replace.textColor;
        _textField.textAlignment = _replace.textAlignment;

        // Dont want to intercept UITextFieldDelegate, so use UITextFieldTextDidChangeNotification instead
        [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(textDidChange:)
                                               name:UITextFieldTextDidChangeNotification
                                             object:_textField];

        // Also need KVO because UITextFieldTextDidChangeNotification not fired when change programmatically
        [_textField addObserver:self forKeyPath:@"text" options:0 context:nil];
    }
    return self;
}

- (void)textDidChange:(NSNotification*)notification
{
    // Update (hidden) UILabel to ensure correct layout
    if (_textField.text.length) {
        _replace.text = _textField.text;
    } else if (_textField.placeholder.length) {
        _replace.text = _textField.placeholder;
    } else {
        _replace.text = @" "; // otherwise UILabel removed from cell (!?)
    }
    [self setNeedsLayout];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ((object == _textField) && [keyPath isEqualToString:@"text"]) [self textDidChange:nil];
}

- (void)dealloc
{
    [_textField removeObserver:self forKeyPath:@"text"];
}

@end

Hemen önce gibi hücre oluşturmak, ama şimdi kullanmak - Basit kullanımı cell.textField yerine cell.detailTextLabel (veya cell.textLabel durumunda UITableViewCellStyleDefault). Örneğin

GSBEditableTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (!cell) cell = [GSBEditableTableViewCell.alloc initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:@"Cell"];

cell.textLabel.text = @"Name";
cell.textField.text = _editablename;
cell.textField.delegate = self; // to pickup edits
...

FD'nin cevabından ilham aldı ve geliştirdi


0

Bu yöntemde UITableViewCell içinde birden çok UITextfield sonraki / dönüş olayları için ben storyboard UITextField almıştı.

@interface MyViewController () {
    NSInteger currentTxtRow;
}
@end
@property (strong, nonatomic) NSIndexPath   *currentIndex;//Current Selected Row

@implementation MyViewController


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UITextField *txtDetails = (UITextField *)[cell.contentView viewWithTag:100];
        txtDetails.delegate = self;

        txtDetails.placeholder = self.arrReciversDetails[indexPath.row];
        return cell;
}


#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    CGPoint point = [textField convertPoint:CGPointZero toView:self.tableView];
    self.currentIndex = [self.tableView indexPathForRowAtPoint:point];//Get Current UITableView row
    currentTxtRow = self.currentIndex.row;
    return YES;
}


- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    currentTxtRow += 1;
    self.currentIndex = [NSIndexPath indexPathForRow:currentTxtRow inSection:0];

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:self.currentIndex];
    UITextField *currentTxtfield = (UITextField *)[cell.contentView viewWithTag:100];
    if (currentTxtRow < 3) {//Currently I have 3 Cells each cell have 1 UITextfield
        [currentTxtfield becomeFirstResponder];
    } else {
        [self.view endEditing:YES];
        [currentTxtfield resignFirstResponder];
    }

}  

Metin alanından metin almak için

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
      switch (self.currentIndex.row) {

            case 0:
                NSLog(@"%@",[NSString stringWithFormat:@"%@%@",textField.text,string]);//Take current word and previous text from textfield
                break;

            case 1:
                 NSLog(@"%@",[NSString stringWithFormat:@"%@%@",textField.text,string]);//Take current word and previous text from textfield
                break;

            case 2:
                 NSLog(@"%@",[NSString stringWithFormat:@"%@%@",textField.text,string]);//Take current word and previous text from textfield
                break;

            default:
                break;
        }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.