আমি আইওএস ডেভলপমেন্ট নবাগত। UITableViewCell
এটি নির্বাচন করা হলে আমি একটি চেকমার্ক যুক্ত করতে চাই । অন্য সারিটি নির্বাচন করা হলে চেকমার্কটি সরানো উচিত। আমি এই কিভাবে করব?
উত্তর:
[tableview reloadData];
// এটি একটি হাতুড়ি ব্যবহার করবেন না ।
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}
আপনার ইউআইটিএবলভিউ ডেটা উত্স পদ্ধতিতে:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil )
{
cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
if ([indexPath compare:self.lastIndexPath] == NSOrderedSame)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
// UITableView Delegate Method
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.lastIndexPath = indexPath;
[tableView reloadData];
}
এবং সর্বশেষপরিচয়টি হ'ল একটি property(strong) NSIndexPath* lastIndexPath;
আমি দেখতে পেলাম যে ডেটা পুনরায় লোড করা কুৎসিত উপায়ে অনির্বাচিত অ্যানিমেশনটিকে বাধা দেয়।
এই সুইফ্ট বাস্তবায়ন চেকমার্কগুলি পরিষ্কারভাবে যোগ / অপসারণ করে এবং সারিটি অপসারণ করে:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if self.lastSelection != nil {
self.myTableView.cellForRowAtIndexPath(self.lastSelection)?.accessoryType = .None
}
self.myTableView.cellForRowAtIndexPath(indexPath)?.accessoryType = .Checkmark
self.lastSelection = indexPath
self.myTableView.deselectRowAtIndexPath(indexPath, animated: true)
}
যেখানে lastSelection
হিসাবে ঘোষণা করা হয়var lastSelection: NSIndexPath!
cellForRowAtIndexPath
প্রয়োজনে অতিরিক্ত কোনও ক্রিয়াকলাপ নেই । ওবজে-সিতে প্রতিলিপি করা কঠিন হওয়া উচিত নয়।
একটি চেকমার্ক সেট করতে:
UITableViewCell *cell = ...;
cell.accessoryType = UITableViewCellAccessoryCheckmark;
কোনও ঘর নির্বাচন / নির্বাচন করতে:
[cell setSelected:TRUE animated:TRUE]; // select
[cell setSelected:FALSE animated:TRUE]; // deselect
পূর্ববর্তী কক্ষটি অনির্বাচিত করতে সর্বশেষ নির্বাচিত ঘরে ট্র্যাক করতে একটি এনএসআইন্ডেক্সপথ * সর্বশেষ নির্বাচিত আইভার ব্যবহার করুন:
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
if (self.lastSelected==indexPath) return; // nothing to do
// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
old.accessoryType = UITableViewCellAccessoryNone;
[old setSelected:FALSE animated:TRUE];
// select new
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[cell setSelected:TRUE animated:TRUE];
// keep track of the last selected cell
self.lastSelected = indexPath;
}
সুইফট 4 আপডেট করুন
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
extension ViewController : UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.dataArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = dataArray[indexPath.row]
if selectedData.contains(dataArray[indexPath.row]) {
cell.accessoryType = .checkmark
}else{
cell.accessoryType = .none
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if selectedData.contains(dataArray[indexPath.row]) {
selectedData.removeLast()
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}else {
selectedData.removeAll()
selectedData.append(dataArray[indexPath.row])
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
print(selectedData)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
}
ডেটাআরএর টেবিল ভিউ তৈরির উপর ভিত্তি করে গঠিত .. একইভাবে, আমি একটি ফাঁকা অ্যারে নিয়েছি এবং যখনই ব্যবহারকারীর কোনও সেলে ট্যাপ করে ডেটাআর্রে থেকে ইনডেক্সভ্যালুয়ের উপর ভিত্তি করে আমি সেই বস্তুটি নির্বাচিত ডেটাআরাইতে সঞ্চয় করে রেখেছি
প্রশ্নটির মতো এর মতো ... একটি প্রশ্নের একাধিক বিকল্প রয়েছে (উত্তর), তবে শেষ পর্যন্ত কেবল একটি বা কোনও উত্তরই ফলস্বরূপ হবে না
একইভাবে, কেবলমাত্র একটি কক্ষের চেকমার্ক দেখাতে হবে এবং অবশিষ্ট কক্ষগুলি অনির্বাচিত হওয়া উচিত ... এটি এমন কোনও ক্ষেত্রে আপনি আপনার উত্তরটি অনির্বাচিত করতে পারেন ... আমি আশা করি এটিই এই প্রশ্নের সেরা উত্তর hope
আমি মনে করি আপনার কাস্টম ইউআইটিএবলভিউসেল প্রয়োগের মধ্যে আনুষাঙ্গিক সেট করা আরও পরিষ্কার। দ্রুতগতিতে, আমি ব্যবহার করেছি:
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
accessoryType = selected ? .checkmark : .none
}
টেবিলভিউতে কেবলমাত্র নির্বাচিত সারির জন্য সুইফট ৪.২ এবং সুইফট ৫ টি কার্যকারী কোডের চেক চিহ্নের ব্যবহার
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
self.tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//print(self.coloursArray[indexPath.row])
self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
ধরে নিই যে আপনি যে শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে আসছেন UITableViewController
, এটি সুইফট 3 এ কৌশলটি করে:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Add a visual cue to indicate that the cell was selected.
self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
}
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
// Invoked so we can prepare for a change in selection.
// Remove previous selection, if any.
if let selectedIndex = self.tableView.indexPathForSelectedRow {
// Note: Programmatically deslecting does NOT invoke tableView(:didSelectRowAt:), so no risk of infinite loop.
self.tableView.deselectRow(at: selectedIndex, animated: false)
// Remove the visual selection indication.
self.tableView.cellForRow(at: selectedIndex)?.accessoryType = .none
}
return indexPath
}
উপরের উত্তরগুলি কার্যকর হয় না যদি আপনি বিপুল সংখ্যক ডেটার জন্য সেলটি পুনরায় ব্যবহার করেন। স্ক্রোল এ আপনি বারবার চেকমার্ক দেখতে পাবেন। নীচের পদক্ষেপগুলি ব্যবহার এড়াতে:
ভেরিয়েবলের উপর ঘোষনা করুন: var indexNumber: NSInteger = -1
সেলফোর্ডআউটআইডেক্সপথের নীচে কোড যুক্ত করুন:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
if indexNumber == indexPath.row{
cell.accessoryType = .checkmark
}else{
cell.accessoryType = .none
}
}
এবং didselectAtIndexpath এ কোডের নীচে যুক্ত করুন:
ওভাররাইড ফানক টেবিলভিউ (_ টেবিল ভিউ: ইউআইটিবেল ভিউ, ডডসিলিটরোউ ইন্ডেক্সপথ: ইনডেক্সপথ) r
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath as IndexPath)?.accessoryType = .checkmark
indexNumber = indexPath.row
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath as IndexPath)?.accessoryType = .none
}
ছোট টাইপ
// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
cell.accessoryType = UITableViewCellAccessoryNone;
[cell setSelected:FALSE animated:TRUE];
পড়া উচিত
// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
old.accessoryType = UITableViewCellAccessoryNone;
[old setSelected:FALSE animated:TRUE];
এবং এছাড়াও
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == [previouslySelected intValue])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
selectedIndex = indexPath;
[cell setSelected:YES animated:YES];
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
[cell setSelected:NO animated:YES];
}
}
যেখানে পূর্বেই নির্বাচিত আপনার স্থানীয় আইভার ইত্যাদি you ভাবে আপনি যদি নির্বাচিত সূচকটি পুনরায় লোড করেন তবে আপনি সম্ভাব্য নির্বাচনের মাধ্যমে ঝাঁকুনির পরে এটিও অনির্বাচিত হন।
অন্য দিক থেকে এই সমস্যার মুখোমুখি হওয়া ভাল। অভ্যন্তরীণ UIKit প্রক্রিয়াগুলিতে সমস্ত কাজ রাখুন এবং প্রয়োগটি UITableViewCell এ সরান:
@implementation MYTableViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
self.accessoryType = selected ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}
- (void)prepareForReuse {
[super prepareForReuse];
self.accessoryType = UITableViewCellAccessoryNone;
}
@end
didSelectRowAtIndexPath
চেকমার্ক দেখানোর জন্য যে কোনও সারি নির্বাচন করুন এবং চেকমার্ককে আড়াল করার জন্য চেকমার্ক সারিটি নির্বাচন করার সময় কেবল কলিত পদ্ধতি Call
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:true];
NSLog(@"touch");
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
আপনার প্রয়োজনে সুইফট 4
var lastSelection: NSIndexPath!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//CHECK MARK THE CELL
if self.lastSelection != nil {
self.tableView.cellForRow(at: self.lastSelection as IndexPath)?.accessoryType = .none
}
self.tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
self.lastSelection = indexPath as NSIndexPath
self.tableView.deselectRow(at: indexPath, animated: true)
}
এটি করতে পারে এমন দুটি উপায় রয়েছে। একটির একাধিক নির্বাচন ছাড়াই এবং অন্যটি একাধিক নির্বাচন সহ।
// Table View Controller -- without Multiple Selection
// Step 1
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if(tableView.cellForRow(at: indexPath)?.imageView?.image == UIImage(systemName:"checkmark.circle")) {
tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"circle")
} else {
tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"checkmark.circle")
}
}
//Step 2
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = employeeValues[indexPath.row]
cell.imageView?.image = UIImage(systemName:"circle")
return cell
}
// Table View Controller -- with Multiple Selection
@IBOutlet var myTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.myTableView.allowsMultipleSelection = true
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = employeeValues[indexPath.row]
cell.imageView?.image = UIImage(systemName:"circle")
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// let cell = tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"checkmark.circle")
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.imageView?.image = UIImage(systemName:"circle")
}
উপরের বর্ণিত কোডটি কেবলমাত্র একক নির্বাচন নিয়ে কাজ করে। এই নিম্নলিখিত কোডটি অবশ্যই একাধিক নির্বাচনের জন্য কাজ করবে ।
- (void)viewDidLoad {
arrSelectionStatus =[NSMutableArray array]; //arrSelectionStatus holds the cell selection status
for (int i=0; i<arrElements.count; i++) { //arrElements holds those elements which will be populated in tableview
[arrSelectionStatus addObject:[NSNumber numberWithBool:NO]];
}
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell==nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
cell.textLabel.text=[arrElements objectAtIndex:indexPath.row];
if ([[arrSelectionStatus objectAtIndex:indexPath.row] boolValue] == YES)
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[arrSelectionStatus replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:YES]];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryNone;
[arrSelectionStatus replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:NO]];
}
যখন একটি নির্বাচিত ঘর (চেক চিহ্ন সহ আবার নির্বাচন করা হয়), কেবল নির্বাচনটি সরিয়ে ফেলুন।
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
BOOL isSelected = ([tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark);
if(isSelected){
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
[tableView deselectRowAtIndexPath:indexPath animated:YES]; //this won't trigger the didDeselectRowAtIndexPath, but it's always a good idea to remove the selection
}else{
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
}
বোনাস:
self.tableView.indexPathForSelectedRow
নির্বাচিত ঘরের জন্য সূচকপথ সনাক্ত করার জন্য ব্যবহার করুন
// Check or Uncheck a cell
if let cell = tableView.cellForRow(at: indexPath) {
if cell.accessoryType == .checkmark {
cell.accessoryType = .none
} else {
cell.accessoryType = .checkmark
}
}