উত্তর:
প্রথমে টেবিলে দৃশ্যে দীর্ঘ প্রেস অঙ্গভঙ্গি সনাক্তকারী যুক্ত করুন:
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];
তারপরে অঙ্গভঙ্গি হ্যান্ডলারে:
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:self.myTableView];
NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"long press on table view at row %ld", indexPath.row);
} else {
NSLog(@"gestureRecognizer.state = %ld", gestureRecognizer.state);
}
}
আপনাকে এ সম্পর্কে সতর্কতা অবলম্বন করতে হবে যাতে এটি ব্যবহারকারীর ঘরের সাধারণ টেপিংয়ের সাথে হস্তক্ষেপ না করে এবং এটিও নোট করে যে handleLongPress
একাধিকবার আগুন লেগে যেতে পারে (এটি অঙ্গভঙ্গি সনাক্তকারী রাষ্ট্রের পরিবর্তনের কারণে হবে)।
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) ...
।
UITableView
, UITableViewCell
...)
আমি আনা-কারেনিনার উত্তরটি ব্যবহার করেছি এবং এটি খুব মারাত্মক বাগ সহ প্রায় দুর্দান্ত কাজ করে।
আপনি যদি বিভাগগুলি ব্যবহার করছেন, বিভাগের শিরোনামটি দীর্ঘ-টিপুন আপনাকে সেই বিভাগের প্রথম সারিটি চাপ দেওয়ার একটি ভুল ফলাফল দেবে, আমি নীচে একটি নির্দিষ্ট সংস্করণ যুক্ত করেছি (প্রতি অঙ্গভঙ্গির অবস্থার উপর ভিত্তি করে ডামি কলগুলির ফিল্টারিং সহ) আনা-কারেনিনা পরামর্শ)।
- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
CGPoint p = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell.isHighlighted) {
NSLog(@"long press on table view at section %d row %d", indexPath.section, indexPath.row);
}
}
}
}
সুইফ্ট 5-এ উত্তর (সুইফটে রিকির উত্তর অবিরত)
যোগ
UIGestureRecognizerDelegate
আপনার ViewController করতে
override func viewDidLoad() {
super.viewDidLoad()
//Long Press
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
longPressGesture.minimumPressDuration = 0.5
self.tableView.addGestureRecognizer(longPressGesture)
}
এবং ফাংশন:
@objc func handleLongPress(longPressGesture: UILongPressGestureRecognizer) {
let p = longPressGesture.location(in: self.tableView)
let indexPath = self.tableView.indexPathForRow(at: p)
if indexPath == nil {
print("Long press on table view, not row.")
} else if longPressGesture.state == UIGestureRecognizer.State.began {
print("Long press on row, at \(indexPath!.row)")
}
}
ডন গানের উত্তর এবং মারমোরের উত্তর মিলিয়ে এখানে স্পষ্ট নির্দেশাবলী দেওয়া হয়েছে।
লম্বা চাপে অঙ্গভঙ্গি সনাক্তকারীকে টেনে আনুন এবং এটি আপনার টেবিল সেলে ফেলে দিন। এটি বামে তালিকার নীচে লাফিয়ে উঠবে।
তারপরে অঙ্গভঙ্গি সনাক্তকারীকে একইভাবে সংযুক্ত করুন আপনি যেমন কোনও বোতামটি সংযুক্ত করবেন।
অ্যাকশন হ্যান্ডলারের মধ্যে মারমোর থেকে কোড যুক্ত করুন
- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
CGPoint p = [sender locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
} else {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell.isHighlighted) {
NSLog(@"long press on table view at section %d row %d", indexPath.section, indexPath.row);
}
}
}
}
এখানে যেমন দেখানো হয়েছে তেমন কক্ষের সাথে সনাক্তকারীকে সরাসরি যুক্ত করতে আরও দক্ষ বলে মনে হচ্ছে:
টেবিলভিউ কক্ষগুলির জন্য, তারপরে এবং এখন আলতো চাপুন
(নীচে উদাহরণে স্ক্রোল করুন)
দ্রুত উত্তর:
UIGestureRecognizerDelegate
আপনার ইউআইটিএবলভিউ কনট্রোলারটিতে প্রতিনিধি যুক্ত করুন ।
ইউআইটিএবল ভিউ কনট্রোলারের মধ্যে:
override func viewDidLoad() {
super.viewDidLoad()
let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
longPressGesture.minimumPressDuration = 1.0 // 1 second press
longPressGesture.delegate = self
self.tableView.addGestureRecognizer(longPressGesture)
}
এবং ফাংশন:
func handleLongPress(longPressGesture:UILongPressGestureRecognizer) {
let p = longPressGesture.locationInView(self.tableView)
let indexPath = self.tableView.indexPathForRowAtPoint(p)
if indexPath == nil {
print("Long press on table view, not row.")
}
else if (longPressGesture.state == UIGestureRecognizerState.Began) {
print("Long press on row, at \(indexPath!.row)")
}
}
আনা কারেনিনার দুর্দান্ত উত্তরের উপর ভিত্তি করে আমি ইউআইটিএবলভিতে সামান্য বিভাগটি রেখেছি।
নিয়মিত সারণী দর্শনগুলি নিয়ে কাজ করার সময় আপনি যেমন অভ্যস্ত তেমন একটি সুবিধাজনক প্রতিনিধি পদ্ধতি পাবেন এর মতো এটি। এটা দেখ:
// UITableView+LongPress.h
#import <UIKit/UIKit.h>
@protocol UITableViewDelegateLongPress;
@interface UITableView (LongPress) <UIGestureRecognizerDelegate>
@property(nonatomic,assign) id <UITableViewDelegateLongPress> delegate;
- (void)addLongPressRecognizer;
@end
@protocol UITableViewDelegateLongPress <UITableViewDelegate>
- (void)tableView:(UITableView *)tableView didRecognizeLongPressOnRowAtIndexPath:(NSIndexPath *)indexPath;
@end
// UITableView+LongPress.m
#import "UITableView+LongPress.h"
@implementation UITableView (LongPress)
@dynamic delegate;
- (void)addLongPressRecognizer {
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.2; //seconds
lpgr.delegate = self;
[self addGestureRecognizer:lpgr];
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
CGPoint p = [gestureRecognizer locationInView:self];
NSIndexPath *indexPath = [self indexPathForRowAtPoint:p];
if (indexPath == nil) {
NSLog(@"long press on table view but not on a row");
}
else {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
// I am not sure why I need to cast here. But it seems to be alright.
[(id<UITableViewDelegateLongPress>)self.delegate tableView:self didRecognizeLongPressOnRowAtIndexPath:indexPath];
}
}
}
আপনি যদি এটি কোনও ইউআইটিএবলভিউ কনট্রোলার ব্যবহার করতে চান তবে আপনার সম্ভবত সাবক্লাস এবং নতুন প্রোটোকলের সাথে সামঞ্জস্য হওয়া দরকার।
এটি আমার পক্ষে দুর্দান্ত কাজ করে, আশা করি এটি অন্যকে সহায়তা করবে!
আধুনিক উত্তর সিনট্যাক্স ব্যবহার করে, অন্যান্য উত্তরগুলি সংহত করে এবং অনিবদ্ধ কোড অপসারণ করে সুইফট 3 টি উত্তর।
override func viewDidLoad() {
super.viewDidLoad()
let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(tablePressed))
tableView.addGestureRecognizer(recognizer)
}
@IBAction func tablePressed(_ recognizer: UILongPressGestureRecognizer) {
let point = recognizer.location(in: tableView)
guard recognizer.state == .began,
let indexPath = tableView.indexPathForRow(at: point),
let cell = tableView.cellForRow(at: indexPath),
cell.isHighlighted
else {
return
}
// TODO
}
স্টোরিবোর্ডে প্রদত্ত প্রোটোটাইপ সেলে কেবলমাত্র ইউআইএলংপ্রেসজেস্টাররনগনাইজার যুক্ত করুন, তারপরে একটি অ্যাকশন পদ্ধতি তৈরি করতে ভিউকন্ট্রোলারের .m ফাইলে অঙ্গভঙ্গিটি টানুন। আমি যেমন বলেছিলাম তেমনই তৈরি করেছি।
টাইমার চালু করতে বা ছোঁয়া বন্ধ হওয়ার পরে এটি বন্ধ করতে স্পর্শগুলিতে ইউআইটিচ টাইমস্ট্যাম্প সম্পত্তিটি ব্যবহার করুন