ইউআইটিএবলভিউতে দীর্ঘক্ষণ টিপুন


191

আমি UITableViewCellএকটি "দ্রুত অ্যাক্সেস মেনু" মুদ্রণের জন্য একটি দীর্ঘ প্রেস পরিচালনা করতে চাই । ইতিমধ্যে কেউ এই কাজ করেছে?

বিশেষত অঙ্গভঙ্গিটি চিনতে পারে UITableView?

উত্তর:


427

প্রথমে টেবিলে দৃশ্যে দীর্ঘ প্রেস অঙ্গভঙ্গি সনাক্তকারী যুক্ত করুন:

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একাধিকবার আগুন লেগে যেতে পারে (এটি অঙ্গভঙ্গি সনাক্তকারী রাষ্ট্রের পরিবর্তনের কারণে হবে)।


1
অসাধারণ !!! অনেক ধন্যবাদ! তবে একটি শেষ সামান্য প্রশ্ন: স্পর্শ শেষ হওয়ার পরে কেন পদ্ধতি হ্যান্ডললপ্রেস কল করা হয় ???

111
সংশোধন: অঙ্গভঙ্গির বিভিন্ন রাজ্যগুলি (শুরু, পরিবর্তিত, শেষ, ইত্যাদি) নির্দেশ করতে এটি একাধিকবার অগ্নিসংযোগ করে। সুতরাং হ্যান্ডলার পদ্ধতিতে, অঙ্গভঙ্গির প্রতিটি রাজ্যে ক্রিয়াটি এড়ানোর জন্য অঙ্গভঙ্গি সনাক্তকারীটির রাষ্ট্রীয় সম্পত্তি পরীক্ষা করুন। উদাহরণ: if (gestureRecognizer.state == UIGestureRecognizerStateBegan) ...

3
ভুলে যাবেন না, অঙ্গভঙ্গি সনাক্তকারীদের এখন সরাসরি ইন্টারফেস বিল্ডারে ইউআই উপাদানগুলিতে যুক্ত করা যেতে পারে এবং আইবিএક્શન পদ্ধতির মাধ্যমে সংযুক্ত করা যেতে পারে, সুতরাং এই উত্তরটি আরও সহজ ;-) (কেবলমাত্র সনাক্তকারীটিকে সংযুক্ত করার জন্য মনে রাখবেন UITableView, UITableViewCell...)

10
ক্লাস। ফাইলের মধ্যে ইউআইজিস্টারআরগনাইজারডেলিগেট প্রোটোকলটিও নিশ্চিত করুন
ভাকিতা

1
আপনি কীভাবে টেবিলের ভিউটি সেলে নেভিগেট করা থেকে আটকাতে পারেন (যদি আপনি 'didSelectRowAtIndexPath' প্রয়োগ করেছেন?)
মার্চ

46

আমি আনা-কারেনিনার উত্তরটি ব্যবহার করেছি এবং এটি খুব মারাত্মক বাগ সহ প্রায় দুর্দান্ত কাজ করে।

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

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

হাই @ ম্যামার: আমি জিজ্ঞাসা করতে চাই যে কোন ব্যবহারকারীর ছোঁয়াছে এমন একটি দৃশ্যের শুধুমাত্র একটি অংশ চিহ্নিত করা সম্ভব?
মান্থান

আরে, আপনি তার জন্য হিট টেস্ট ব্যবহার করতে পারেন ( বিকাশকারী / অ্যাপ্লিকেশন / লাইব্রেরি / আইস / ডকুমেন্টেশন / ইউইকিট / রেফারেন্স /… )। : কিভাবে ব্যবহার করার জন্য উদাহরণস্বরূপ এই উত্তর চেক করুন stackoverflow.com/a/2793253/819355
marmor

যদিও গৃহীত উত্তর কাজ করে। এটি স্ক্রিনে টেনে আনার সময় লগিংয়ের সাথে একাধিক ফায়ার লগ করে। এই উত্তর না। একটি বৈধ কপি এবং পেস্ট উত্তর। ধন্যবাদ.
ChrisOSX

29

সুইফ্ট 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)")
    }
}

20

ডন গানের উত্তর এবং মারমোরের উত্তর মিলিয়ে এখানে স্পষ্ট নির্দেশাবলী দেওয়া হয়েছে।

লম্বা চাপে অঙ্গভঙ্গি সনাক্তকারীকে টেনে আনুন এবং এটি আপনার টেবিল সেলে ফেলে দিন। এটি বামে তালিকার নীচে লাফিয়ে উঠবে।

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

তারপরে অঙ্গভঙ্গি সনাক্তকারীকে একইভাবে সংযুক্ত করুন আপনি যেমন কোনও বোতামটি সংযুক্ত করবেন। এখানে চিত্র বর্ণনা লিখুন

অ্যাকশন হ্যান্ডলারের মধ্যে মারমোর থেকে কোড যুক্ত করুন

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

}


2
আমার মতে সেরা উত্তর
এসেন কাসিমভ

8
দীর্ঘ প্রেস অঙ্গভঙ্গি সনাক্তকারীকে টেবিল ভিউ সেল নয় টেবিল ভিউতে প্রয়োগ করা উচিত। টেবিল ভিউ সেল এ এটিকে ফেলে দেওয়ার ক্ষেত্রে কেবল দীর্ঘ 0 টি শোনা সারি 0 থাকবে।
অ্যালেক্স

14

এখানে যেমন দেখানো হয়েছে তেমন কক্ষের সাথে সনাক্তকারীকে সরাসরি যুক্ত করতে আরও দক্ষ বলে মনে হচ্ছে:

টেবিলভিউ কক্ষগুলির জন্য, তারপরে এবং এখন আলতো চাপুন

(নীচে উদাহরণে স্ক্রোল করুন)


7
কীভাবে প্রতিটি সারিটির জন্য একটি নতুন অঙ্গভঙ্গি সনাক্তকারী বস্তু বরাদ্দ করা পুরো টেবিলের জন্য একটি একক সনাক্তকারীর চেয়ে আরও দক্ষ হতে পারে?
ব্যবহারকারী 2393462435

7
মনে রাখবেন যে প্রবীণটি সঠিকভাবে কাজ করে থাকলে কেবল কয়েকটি কক্ষ তৈরি হয়েছে।
পিঁপড়া

11

দ্রুত উত্তর:

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

}

6

আনা কারেনিনার দুর্দান্ত উত্তরের উপর ভিত্তি করে আমি ইউআইটিএবলভিতে সামান্য বিভাগটি রেখেছি।

নিয়মিত সারণী দর্শনগুলি নিয়ে কাজ করার সময় আপনি যেমন অভ্যস্ত তেমন একটি সুবিধাজনক প্রতিনিধি পদ্ধতি পাবেন এর মতো এটি। এটা দেখ:

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

আপনি যদি এটি কোনও ইউআইটিএবলভিউ কনট্রোলার ব্যবহার করতে চান তবে আপনার সম্ভবত সাবক্লাস এবং নতুন প্রোটোকলের সাথে সামঞ্জস্য হওয়া দরকার।

এটি আমার পক্ষে দুর্দান্ত কাজ করে, আশা করি এটি অন্যকে সহায়তা করবে!


প্রতিনিধিদল এবং বিভাগের নিদর্শনগুলির আশ্চর্যজনক ব্যবহার
ভ্যালকোচো

5

আধুনিক উত্তর সিনট্যাক্স ব্যবহার করে, অন্যান্য উত্তরগুলি সংহত করে এবং অনিবদ্ধ কোড অপসারণ করে সুইফট 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
}

2

স্টোরিবোর্ডে প্রদত্ত প্রোটোটাইপ সেলে কেবলমাত্র ইউআইএলংপ্রেসজেস্টাররনগনাইজার যুক্ত করুন, তারপরে একটি অ্যাকশন পদ্ধতি তৈরি করতে ভিউকন্ট্রোলারের .m ফাইলে অঙ্গভঙ্গিটি টানুন। আমি যেমন বলেছিলাম তেমনই তৈরি করেছি।


আপনি কি আরও কিছু ব্যাখ্যা করতে পারেন? আপনি কি প্রোটোটাইপ সেলটিকে আপনার ভিসিতে একটি সম্পত্তি বানিয়েছেন?
ইথান পার্কার

-2

টাইমার চালু করতে বা ছোঁয়া বন্ধ হওয়ার পরে এটি বন্ধ করতে স্পর্শগুলিতে ইউআইটিচ টাইমস্ট্যাম্প সম্পত্তিটি ব্যবহার করুন


আপনার উত্তরের জন্য ধন্যবাদ তবে আমি কীভাবে সনাক্ত করতে পারি যে কোন সারিটি স্পর্শের সাথে সম্পর্কিত?

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

আমি নিশ্চিত যে এটি করার একটি সহজ উপায় আছে, যাইহোক আপনার যদি অন্য ধারণা থাকে তবে আমি এখানে উপস্থিত থাকব :)
06

আরও সহজ কিছু সম্ভব কিনা তা জানতে পেরে আমি আনন্দিত হব। তবে আমি মনে করি না, বেশিরভাগ কারণ অ্যাপল আমাদের মতবিনিময় পরিচালনা করতে চায় না ... এটি এই "দ্রুত অ্যাক্সেস মেনু" ভাবার কোনও অ্যান্ড্রয়েড পদ্ধতির মতো বলে মনে হচ্ছে way যদি এটি আমার অ্যাপ্লিকেশন হয় তবে আমি এটি টুইটার অ্যাপের মতো পরিচালনা করব। বাম দিকে একটি সোয়াইপ বিকল্পগুলি প্রদর্শন করে
থমাস জোলিন

হ্যাঁ, আমি সে সম্পর্কে ভেবেছিলাম, সুতরাং যদি আমি সত্যিই এটি দীর্ঘ প্রেস ইভেন্টের সাথে না করতে পারি তবে আমি সোয়াইপ পদ্ধতিটি ব্যবহার করব। তবে, স্ট্যাক-ওভারফ্লোতে কেউ এটি করেছে ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.