একটি ইউআইটিএবল ভিউসেল-এ একটি ইউআইটিএক্সটাক্ট ফিল্ড


178

আমি এখন কি করতে যে কয়েকদিন জন্য চেষ্টা করছি, এবং যে কাজ করতে খুব চেষ্টা মানুষের বার্তা টন পড়ার পর আমি এখনও সম্পূর্ণরূপে কাজ আছে অক্ষম নই UITextFieldআমার কিছু UITableViewCells, শুধু এই উদাহরণে মত:

স্ক্রিনশট

হয় আমার কাছে ফর্মটি কাজ করছে তবে পাঠ্যটি দৃশ্যমান নয় (যদিও আমি এর রঙটি নীল করে দিয়েছি), কীবোর্ডটি যখন আমি ক্লিক করি তখন এটি মাঠে যায় এবং আমি কীবোর্ডের ইভেন্টগুলি সঠিকভাবে প্রয়োগ করতে সক্ষম হইনি। আমি অ্যাপলের কাছ থেকে বেশ কয়েকটি উদাহরণ দিয়ে চেষ্টা করেছি (প্রধানত UICatalog, যেখানে একটি ধরণের অনুরূপ নিয়ন্ত্রণ রয়েছে) তবে এটি এখনও সঠিকভাবে কাজ করছে না।

করতে কারো সাহায্যের আমাকে (এবং সমস্ত লোক এই নিয়ন্ত্রণ উপলব্ধি করার চেষ্টা) এবং একটি সহজ বাস্তবায়ন পোষ্ট UITextFieldএকটি UITableViewCell, যে সূক্ষ্ম কাজ করে?


আমি এটা কাজ ছিল। তবে কেবল কয়েকটি ক্ষেত্রের জন্য। আপনি যখন টেবিলের একাধিক ক্ষেত্র বা কেবল একটি ক্ষেত্র রাখেন তখন আপনি সমস্যার মধ্যে পড়ে যাচ্ছেন?
পিইজেড

আমার কেবল এটি 2 টি ক্ষেত্রের জন্য কাজ করা প্রয়োজন ... এটি এখনই কাজ করছে না, যদিও আমি একটি ক্ষেত্রের জন্য চেষ্টা করি। আপনি কি বাস্তবায়ন কাজ করছেন পোস্ট করতে পারেন? আপনাকে PEZ ধন্যবাদ!
ম্যাথিউ

আপনি সম্পাদনাযোগ্য ডেটাভিউ নমুনা চেষ্টা করেছেন? আপনি এখানে এখনও উত্তর নিয়ে মন্তব্য করতে পারবেন না বলেই এখানে প্রশ্ন লিখছেন।
পিইজেড

হাই বন্ধুরা এটা সম্ভব tableview একাধিক পাঠ্যক্ষেত্র যোগ করার জন্য এর stackoverflow.com/questions/19621732/...
শিব

2
ওয়েবে সমস্ত উত্তর নীচে কেন সিদ্ধ হয় CGRectMake(A_MAGIC_NUMBER, ANOTHER_MAGIC_NUMBER, YET_ANOTHER_HARDCODED_MAGIC_NUMBER, OH_HERES_ANOTHER_MYSTERIOUS_HARDCODED_MAGIC_NUMBER)? এই সংখ্যাগুলি কোথা থেকে আসে?
জামেসফিশার

উত্তর:


222

এটি চেষ্টা করে দেখুন। আমার জন্য (আইফোন ডিভাইসগুলিতে) কবজির মতো কাজ করে। আমি এই কোডটি একবার লগইন স্ক্রিনের জন্য ব্যবহার করেছি। আমি দুটি বিভাগ থাকতে টেবিল ভিউটি কনফিগার করেছি। আপনি অবশ্যই বিভাগের শর্তাবলী পরিত্রাণ পেতে পারেন।

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

ফলাফলটি এরকম দেখাচ্ছে:

লগইন ফরম


1
আমি প্রায় একই জিনিস চেষ্টা করছি। তবে সারিটি নির্বাচন করা হলে কেবল পাঠ্য ক্ষেত্রটি প্রদর্শিত হয়। নাহলে মোটেও আঁকা হয় না। উপরের উদাহরণে আমি কেবলমাত্র লেবেল পেয়েছি, অর্থাৎ লগইন। এটি আইপ্যাডে আইওএস ৪.২ সহ রয়েছে।
ডেভিড

3
আসলে, একটি আরও ভাল প্রশ্ন: আপনি কীভাবে পরবর্তী / ফেরত কীবোর্ড ইভেন্টটি পরিচালনা করবেন?
রব

3
@ রব: আপনি ইভেন্টের মাধ্যমে ডেটা পেতে পারেন। আমি দখল editingDidEnd ইভেন্টে UITextField বিষয়বস্তু, তাই মত এটি সেট আপ: [_field addTarget:self action:@selector(editingEnded:) forControlEvents:UIControlEventEditingDidEnd];
কোরি লারসন

7
আপনার সেল সেল নয় কনটেন্টভিউয়ের একটি সংক্ষিপ্তসার হিসাবে ইউআইটিেক্সটফিল্ড যুক্ত করতে হবে।
অ্যাডামস

6
[cell addSubview:playerTextField];এটি আইওএস 5.0+ এর সাথে কাজ করার জন্য ব্যবহার করুন ।
স্টানার

47

এখানে একটি সমাধান iOS6 / 7/8/9 এর অধীন ভাল দেখায়

2016-06-10 আপডেট করুন: এটি এখনও আইওএস 9.3.3 এর সাথে কাজ করে

আপনার সমস্ত সহায়তার জন্য ধন্যবাদ, এটি এখন https://github.com/fulldecent/FDTextFieldTableViewCell এ কোকোপডস / কার্থেজ / এসপিএম এ

মূলত আমরা স্টকটি নিয়ে যাই UITableViewCellStyleValue1এবং UITextFieldযেখানে স্টাফাল হয় সেখানে থাকার detailTextLabelকথা। এটি আমাদের সমস্ত দৃশ্যের জন্য স্বয়ংক্রিয় প্লেসমেন্ট দেয়: আইওএস 6/7/8/9, আইফোন / আইপ্যাড, চিত্র / নো-চিত্র, আনুষঙ্গিক / নন-আনুষঙ্গিক, প্রতিকৃতি / ল্যান্ডস্কেপ, 1x / 2x / 3x।

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: এটি স্টোরিবোর্ডটি UITableViewCellStyleValue1"শব্দ" নামে একটি টাইপ ঘর ব্যবহার করছে cell

- (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
এই উত্তরটি দেখার জন্য উপরের ভোটের পর্বতমালার মধ্য দিয়ে স্ক্রোল করার জন্য ধন্যবাদ!
উইলিয়াম এন্টারিকেন

1
দ্বারা UITableViewCellStyleRightDetailআপনি বোঝাতে চাচ্ছেন UITableViewCellStyleValue1?
ma11 শেই 28

1
দুর্ভাগ্যক্রমে, কনসোলে পাঠ্য প্রাচীরের সাথে 'একযোগে সীমাবদ্ধতাগুলি পূরণ করতে অক্ষম' ছোঁড়ে।
ড্রিমজার

এছাড়াও, যদি সেল.ডেটেলটেক্সটবেলকে গোপনে সেট করা থাকে তবে এটি তার ডানদিকে ('ট্রেলিং') একেবারেই প্রান্তিক করে তোলে না।
স্বপ্নজার

আমার সাথে স্টোরিবোর্ড ব্যবহার করে এটি ক্র্যাশ হয়ে গেছে। আপনি স্টোরিবোর্ড দিয়ে এটি ব্যবহার করতে পারেন?
সিরিস

23

আমি এটি কীভাবে অর্জন করেছি তা এখানে:

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

এটি কিছুটা ভার্জোজ মনে হতে পারে, তবে এটি কার্যকর!

প্রতিনিধি সেট করতে ভুলবেন না!


16

আর একবার চেষ্টা কর. এটি পাশাপাশি স্ক্রোলিং পরিচালনা করতে পারে এবং আপনি পূর্বে যুক্ত করা মতামতগুলি সরানোর ঝামেলা ছাড়াই ঘরগুলি পুনরায় ব্যবহার করতে পারেন।

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

এই স্নিপেটটি কোথাও একটি [ইনপুটটেক্সট রিলিজ] হারিয়েছে? সম্ভবত ভিউডিডনলোড পদ্ধতিতে অন্যথায় একটি মেমরি ফাঁস হয়।
টিম পটার

পুরানো পোস্ট কিন্তু ... আমি পাঠ্য বাক্সটির ফন্টটি আরও ছোট বা বড় করতে পারি না। এটা কি সম্ভব?
Schultz9999

1
কেউ কি একটি সুইফট স্নিপেট সমাধান সরবরাহ করতে পারেন?
কাপটেন

14

এটি কঠিন হতে হবে না। আপনার টেবিলের জন্য একটি ঘর তৈরি করার সময়, ঘরের সামগ্রী দর্শনে একটি ইউআইটিেক্সটফিল্ড অবজেক্ট যুক্ত করুন

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

ইউআইটিেক্সটফিল্ডের প্রতিনিধিটিকে স্ব হিসাবে সেট করুন (যেমন আপনার ভিউকন্ট্রোলার) পাঠ্য ক্ষেত্রে একটি ট্যাগ দিন যাতে আপনি সনাক্ত করতে পারেন আপনার প্রতিনিধি পদ্ধতিতে কোন পাঠ্যক্ষেত্রটি সম্পাদনা করা হয়েছিল। ব্যবহারকারী পাঠ্য ক্ষেত্রটি ট্যাপ করার সময় কীবোর্ডটি পপ আপ হওয়া উচিত। আমি এটি এই মত কাজ পেয়েছিলাম। আশা করি এটা সাহায্য করবে.


আমি এই সমাধান পছন্দ করতে ঘটতে। যদি আপনি CGRectZeroকোনও ফ্রেম হিসাবে সময়ের সাথে আগে আপনার পাঠ্য ক্ষেত্রটি সেটআপ করেন তবে আপনি নিজের পাঠ্য ক্ষেত্রটির ফ্রেমটি ভিউ হায়ারার্কিতে যুক্ত করার আগে সেটআপ করে নিন। এই জাতীয় কাজের জন্য কক্ষের সামগ্রী দেখার frameসম্পত্তি পাওয়া বিশেষত সহায়ক।
বেন ক্রিগার

11

বিস্তারিত

  • এক্সকোড 10.2 (10E125), সুইফট 5

সম্পূর্ণ নমুনা কোড

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)\"")
        }
    }
}

ফলাফল

এখানে চিত্র বর্ণনা লিখুন


9

[cell.contentView bringSubviewToFront:textField]আমার সেলগুলি প্রতিবার উপস্থিত হওয়ার সাথে সাথে চালানোর জন্য একটি পদ্ধতি কল করে আমি এড়িয়ে চলেছি, তবে তখন আমি এই অপেক্ষাকৃত সহজ কৌশলটি আবিষ্কার করেছি:

cell.accessoryView = textField;

একই ব্যাকগ্রাউন্ড-ওভারপাস্টিং ইস্যু বলে মনে হচ্ছে না এবং এটি নিজের (কিছুটা) নিজেই সারিবদ্ধ হয়। এছাড়াও, পাঠ্য লেবেল এটিতে (বা এর নীচে) প্রবাহিত হওয়া এড়াতে অটো-কেটে ফেলেছে, যা কার্যকর।


আমি ওটা ফিরিয়ে নিলাম .. আমার ভালো লাগেনি। = (
হেনলি চিউ

10
হিশোক-- কি হয়েছে?
বেন মোশার

4

আমি একই সমস্যা মধ্যে দৌড়ে। দেখে মনে হচ্ছে cell.textlabel.textসম্পত্তিটি সেট করা ইউআইএলবেলকে ঘরের কনটেন্টভিউয়ের সামনে নিয়ে আসে। সেটিংয়ের পরে টেক্সটভিউ যুক্ত করুন textLabel.text, বা (যদি এটি সম্ভব না হয়) এটিকে কল করুন:

[cell.contentView bringSubviewToFront:textField]

2

আমি ইউপিএলভিউতে টেক্সট ক্ষেত্রগুলি অদৃশ্য দেখানো এবং পুরো সারিটি যখন ফোকাস হয়ে যায় তখন নীল হয়ে যায়, এই আইপ্যাডে আমি এই টাস্কটির সাথে সত্যিই লড়াই করেছি।

শেষ পর্যন্ত আমার জন্য যা কাজ করেছে সেটি হ'ল অ্যাপল-এর টেবিল ভিউ প্রোগ্রামিং গাইডের "টেকনিক ফর স্ট্যাটিক রো কন্টেন্ট" এর আওতায় বর্ণিত । আমি দেখার জন্য এনআইবিতে একটি ইউআইটিএবলভিউসিলের মধ্যে লেবেল এবং পাঠ্য ফিল্ড উভয়ই রেখেছি এবং সেই ঘরটি একটি আউটলেটের মাধ্যমে টেনে আনছি cellForRowAtIndexPath:। ফলাফলযুক্ত কোডটি ইউআইসিএ্যাটলগের চেয়ে অনেক বেশি সুন্দর।


1

এখানে এটি কীভাবে হয়েছে আমি সঠিকভাবে বিশ্বাস করি। আমি এটি পরীক্ষার সাথে সাথে এটি আইপ্যাড এবং আইফোনে কাজ করে। একটি ইউটিবেলভিউসেলকে শ্রেণিবদ্ধ করে আমাদের নিজস্ব কাস্টমসেলগুলি তৈরি করতে হবে:

ইন্টারফেসবিল্ডারে শুরু করুন ... একটি নতুন ইউআইভিউ কনট্রোলার তৈরি করুন যাকে কাস্টমসেল বলুন (এক্সিবিতে স্বেচ্ছাসেবক থাকাকালীন) নিশ্চিত করুন কাস্টমসেলটি ইউটিভ্যালিভিউসেলের একটি সাবক্লাস

এখনই সমস্ত দর্শন মুছুন এবং একটি ভিউ তৈরি করুন এটি একটি পৃথক কক্ষের আকার করে। এই দৃশ্যটি সাবক্লাস কাস্টমসেল করুন। এখন অন্য দুটি মতামত তৈরি করুন (প্রথমটি সদৃশ করুন)।
আপনার সংযোগ পরিদর্শকের কাছে যান এবং 2 টি আইবিআউটলেটগুলি সন্ধান করুন আপনি এখন এই দর্শনগুলির সাথে সংযোগ করতে পারেন।

-ব্যাকগ্রাউন্ডভিউ -নির্বাচিত ব্যাকগ্রাউন্ড

এগুলি সর্বশেষ দুটি দর্শনগুলির সাথে সংযুক্ত করুন যা আপনি কেবল অনুলিপি করেছেন এবং সেগুলি সম্পর্কে উদ্বিগ্ন হন না। একেবারে প্রথম দৃশ্য যা কাস্টমসেল প্রসারিত করে, এর ভিতরে আপনার লেবেল এবং ইউটেক্সটফিল্ড রাখবে। কাস্টমসেল। এ গিয়ে আপনার লেবেল এবং পাঠ্যক্ষেত্রটি সজ্জিত করুন। সম্পন্ন হয়েছে 75 (প্রতিটি ঘরের উচ্চতা) বলতে এই দর্শনটির উচ্চতা নির্ধারণ করুন।

আপনার কাস্টমসেল.এম ফাইলে নিশ্চিত করুন যে কনস্ট্রাক্টর এর মতো দেখায়:

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

এখন একটি ইউআইটিএবল ভিউ কন্ট্রোলার তৈরি করুন এবং এই পদ্ধতিতে কাস্টমসেল শ্রেণিটি এর মতো ব্যবহার করুন:

- (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

এখানে একটি ড্রপ-ইন সাবক্লাস রয়েছে UITableViewCellযার জন্য বিশিষ্ট পাঠ্য লেবেলটিকে একটি সম্পাদনযোগ্য UITextField(বা, ক্ষেত্রে UITableViewCellStyleDefault, পাঠ্য - লেবেলের পরিবর্তে ) দিয়ে প্রতিস্থাপন করবে । এর সুবিধা রয়েছে যা এটি আপনাকে সমস্ত পরিচিত ইউআইটিএবলভিউসিল স্টাইলস, অ্যাকসেসরিভিউস ইত্যাদির পুনরায় ব্যবহার করতে দেয়, ঠিক এখন বিশদটি সম্পাদনাযোগ্য!

@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

সরল ব্যবহার করতে - শুধু আগের মত আপনার সেল তৈরি, কিন্তু এখন ব্যবহার cell.textField পরিবর্তে cell.detailTextLabel (অথবা cell.textLabel ক্ষেত্রে UITableViewCellStyleDefault)। যেমন

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
...

দ্বারা অনুপ্রাণিত এবং উন্নত, এফডি এর উত্তর


0

এই পদ্ধতিতে ইউআইটিএবলভিউসিলের অভ্যন্তরে একাধিক ইউআইটিেক্সটফিল্ডে পরবর্তী / রিটার্ন ইভেন্টগুলির জন্য আমি স্টোরিবোর্ডে ইউআইটিেক্সটফিল্ড নিয়েছি।

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

}  

পাঠ্যক্ষেত্র থেকে পাঠ্য ধরতে-

- (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;
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.