অ্যাডটারেজেটে প্যারামিটারগুলি পাস করা হচ্ছে: ক্রিয়া: নিয়ন্ত্রণ নিয়ন্ত্রণের জন্য


125

আমি addTarget ব্যবহার করছি: ক্রিয়া: forControlEvents এই জাতীয়:

[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];

এবং আমি আমার নির্বাচক "স্যুইচটোনিউজ ডেটেলগুলি" পরামিতিগুলি পাস করতে চাই pass আমি সফল হয়েছি কেবলমাত্র (আইডি) প্রেরককে লিখে লিখে পাস করা:

action:@selector(switchToNewsDetails:)

তবে আমি পূর্ণসংখ্যার মানগুলির মতো ভেরিয়েবলগুলি পাস করার চেষ্টা করছি। এভাবে লেখালেখি কাজ করে না:

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];

এটি এইভাবে লেখালেখি কার্যকর হয় না:

int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];

কোন সাহায্য প্রশংসা করা হবে :)


স্যুইচটোনিউজডটেলগুলির জন্য পদ্ধতি স্বাক্ষর কী?
অ্যারন স্যান্ডার্স

- (শূন্য) সুইচটোনিউজ বিবরণ: (আইডি) প্রেরক; - (অকার্যকর) স্যুইচটোনিউজ বিবরণ: (অন্তর্) আমি: (আইডি) প্রেরক;
পিয়েরে এস্পেনান

তবে আমি কিসের উপর নির্ভর করি? এটি প্রতিটি বোতামের জন্য নির্দিষ্ট? আমার উত্তর দেখুন - ট্যাগ সম্পত্তি আপনি কি প্রয়োজন হয় না?
ভ্লাদিমির


@ পিয়ারেস্পেনান আপনার বর্তমান গৃহীত উত্তরটি কেবল ট্যাগের মাধ্যমে পূর্ণসংখ্যার মধ্য দিয়ে যেতে দেয় যা খুব সীমাবদ্ধ। আমি আপনাকে আমার উত্তরে এটি পরিবর্তন করার জন্য অনুরোধ করছি যা কোনও বস্তু পাস করার অনুমতি দেয় । stackoverflow.com/a/40051706/2057171
অ্যালবার্ট রেনশো

উত্তর:


173
action:@selector(switchToNewsDetails:)

আপনি switchToNewsDetails:এখানে পদ্ধতিতে পরামিতিগুলি পাস করবেন না । আপনি যখন সুনির্দিষ্ট ক্রিয়াকলাপ ঘটে তখন কল করতে বোতামটি সক্ষম করতে আপনি কেবল একটি নির্বাচক তৈরি করেন (আপনার ক্ষেত্রে স্পর্শ করুন)। নিয়ন্ত্রণগুলি ক্রিয়া প্রতিক্রিয়া জানাতে 3 ধরণের নির্বাচক ব্যবহার করতে পারে, তাদের সকলেরই তাদের প্যারামিটারগুলির পূর্বনির্ধারিত অর্থ রয়েছে:

  1. কোন পরামিতি সঙ্গে

    action:@selector(switchToNewsDetails)
  2. 1 পরামিতিটি নিয়ন্ত্রণটি নির্দেশ করে যা বার্তাটি প্রেরণ করে

    action:@selector(switchToNewsDetails:)
  3. 2 পরামিতিগুলি নিয়ন্ত্রণটি নির্দেশ করে যা বার্তাটি প্রেরণ করে এবং ইভেন্টটি যা বার্তাটিকে ট্রিগার করে:

    action:@selector(switchToNewsDetails:event:)

আপনি ঠিক কী করার চেষ্টা করছেন তা স্পষ্ট নয়, তবে প্রতিটি বোতামে একটি নির্দিষ্ট বিশদ সূচক নির্ধারণ করতে চাইলে আপনি নিম্নলিখিতটি করতে পারেন:

  1. প্রয়োজনীয় সূচক সমান প্রতিটি বোতামে একটি ট্যাগ সম্পত্তি সেট করুন
  2. মধ্যে switchToNewsDetails:পদ্ধতি আপনি যে সূচক এবং খোলা উপযুক্ত deatails প্রাপ্ত করতে পারেন:

    - (void)switchToNewsDetails:(UIButton*)sender{
        [self openDetails:sender.tag];
        // Or place opening logic right here
    }

4
আমরা যদি পূর্ণসংখ্যা ব্যতীত অন্য কিছু পাস করার চেষ্টা করছি? আমার যদি স্ট্রিংয়ের মতো কোনও বস্তু পাস করার দরকার হয়?
ব্যবহারকারী 102008

@ ব্যবহারকারী আপনার প্রসঙ্গ কি? দেখে মনে হচ্ছে আপনার এটি আলাদাভাবে পাস করতে হবে
ভ্লাদিমির

অনেক ধন্যবাদ. আপনি এই তথ্য কোথায় পেলেন? আমি সর্বদা রেফারেন্সটির প্রশংসা করি যাতে সম্ভবত আমি এটি পরের বার খুঁজে পেতে পারি।
বিয়ারমাউন্ট

1
@ বিয়ারমাউন্টেন আপনি এই লিঙ্কটি পরীক্ষা করতে পারেন: ডেভেলপার.এপল. com/লিবেরি / ম্যাক /# ডকুমেন্টেশন / কোকোয়া / কনসেপ্টুয়াল / ......... উদাহরণস্বরূপ
ভ্লাদিমির

3
আপনার এটি আলাদাভাবে পাস করার দরকার নেই। আপনি যদি কোনও এনএসবজেক্ট পাস করে থাকেন তবে আপনি ঠিক বলতে পারেন [button.layer setValue:yourObject forKey:@"anyKey"];এবং তারপরে পদ্ধতিটি পরীক্ষা করে দেখুন (objectClass *)[button.layer valueForKey:@"anyKey"];এটি আরও নিখরচায় সংস্করণের মতো.tag
অ্যালবার্ট রেনশো

64

বোতামটি ক্লিক করে কাস্টম প্যারামগুলি পাস করার জন্য আপনাকে কেবল ইউআইবাটনটি সাবস্ক্রাস করতে হবে

(এএসআর চালু আছে, সুতরাং কোডটিতে কোনও প্রকাশ নেই))

এটি আমারবাটন

#import <UIKit/UIKit.h>

@interface myButton : UIButton {
    id userData;
}

@property (nonatomic, readwrite, retain) id userData;

@end

এটি আমারবাটন.এম

#import "myButton.h"
@implementation myButton
@synthesize userData;
@end

ব্যবহার:

myButton *bt = [myButton buttonWithType:UIButtonTypeCustom];
[bt setFrame:CGRectMake(0,0, 100, 100)];
[bt setExclusiveTouch:NO];
[bt setUserData:**(insert user data here)**];

[bt addTarget:self action:@selector(touchUpHandler:) forControlEvents:UIControlEventTouchUpInside];

[view addSubview:bt];

পুনরুদ্ধার ফাংশন:

- (void) touchUpHandler:(myButton *)sender {
    id userData = sender.userData;
}

উপরের কোডের যে কোনও অংশে যদি আমাকে আরও সুনির্দিষ্ট করার প্রয়োজন হয় - তবে মন্তব্য সম্পর্কে এই বিষয়ে নির্দ্বিধায় জিজ্ঞাসা করুন।


আমি মনে করি এটিই সেরা উপায়
Çaatatay Gürtürk

সর্বাধিক মার্জিত সমাধান।
ভিক্টর সি।

2
দুর্দান্ত উত্তর ... খুব স্বনির্ধারিত able ঠিক আমি খুঁজছেন ছিল কি. MOLODETS! :)
denikov

প্রতিক্রিয়াটির জন্য ধন্যবাদ :) খুশি, এটি
কারওর

1
সহজ এবং দরকারী কাজ। আমাকে কেবল যুক্ত করতে দিন যে এটি tagঅ্যান্ড্রয়েড ভিউগুলিতে থাকা সম্পত্তির সাথে সমান । তারা যে কোনও বস্তু সংরক্ষণ করতে পারে। এবং আপনি অভিধান / মানচিত্রের মতো কী দ্বারা অবজেক্টগুলিও সঞ্চয় করতে পারেন ।
ফেরান মেলিনচ

19

টার্গেট-অ্যাকশন তিনটি পৃথক ফর্ম অ্যাকশন নির্বাচকের অনুমতি দেয়:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

16

.Tag এর মাধ্যমে কেবল একটি (অন্তর্) এর চেয়ে বেশি প্রয়োজন? কেভিসি ব্যবহার করুন!

আপনি নিজের পছন্দ মতো যে কোনও ডেটা বাটন অবজেক্টের মাধ্যমেই পাস করতে পারেন (ক্যালিয়ার কীভ্যালু ডিক্ট অ্যাক্সেস করে)।


আপনার লক্ষ্যটিকে এটির মতো সেট করুন (":" সহ)

[myButton addTarget:self action:@selector(buttonTap:) forControlEvents:UIControlEventTouchUpInside];

বোতামে নিজের ডেটা (গুলি) নিজেই যুক্ত করুন (এটির মতো বোতামটি ভাল .layer):

NSString *dataIWantToPass = @"this is my data";//can be anything, doesn't have to be NSString
[myButton.layer setValue:dataIWantToPass forKey:@"anyKey"];//you can set as many of these as you'd like too!

তারপরে বোতামটি আলতো চাপলে আপনি এটির মতো এটি পরীক্ষা করতে পারেন:

-(void)buttonTap:(UIButton*)sender{

    NSString *dataThatWasPassed = (NSString *)[sender.layer valueForKey:@"anyKey"];
    NSLog(@"My passed-thru data was: %@", dataThatWasPassed);

}

UIButton.layer এ কোনও অবজেক্ট সেট বা যুক্ত করার জন্য কোনও পদ্ধতি নেই। আপনি কোথায় এই সমাধান পাবেন?
এমএসি

1
একটি ইউআইবাটন হ'ল এক ধরণের ইউআইভিউ, সমস্ত ইউআইভিউয়ের কাছে কালায়ার। ক্লেয়ার সম্পত্তি থাকে। CALayer এ NSD शब्दकोয় আচরণ রয়েছে। দ্রষ্টব্য এটি উদ্দেশ্য-সিটি সুইফট নয়, এটি হতে পারে? ক্যালায়ার কী-মান কোডিংয়ের জন্য অ্যাপলের ডক্স এখানে রয়েছে: বিকাশকারী.এপলল /
অ্যালবার্ট রেনশো

1
এটি শীর্ষে উত্তর হওয়া উচিত। এখন পর্যন্ত এটি করার সবচেয়ে সহজ উপায়! ধন্যবাদ!
ড্যানিয়েলরোসরো

1
এটি উত্তর গ্রহণ করা উচিত tsএটি অনেক সহজ এবং স্মার্ট উপায়।
ইমন

1
দুর্দান্ত উত্তর! আশা করি আমি এটি অনেক আগে জানতাম।
জন

7

উপরের তথ্যের ভিত্তিতে আমি একটি সমাধান তৈরি করেছি। আমি কেবল যে স্ট্রিংটি পাস করতে চাইছি তাতে শিরোনাম লেবেল.টেক্সট সেট করেছি এবং শিরোনামটি লেবেল hmitted = হ্যাঁ

এটার মত :

UIButton *imageclick = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
imageclick.frame = photoframe;
imageclick.titleLabel.text = [NSString stringWithFormat:@"%@.%@", ti.mediaImage, ti.mediaExtension];
imageclick.titleLabel.hidden = YES;

এইভাবে, কোনও উত্তরাধিকার বা বিভাগের প্রয়োজন নেই এবং কোনও মেমরি ফুটো নেই


5

আমি অ্যারেতে প্রতিটি ফোন নম্বরটির জন্য কয়েকটি বোতাম তৈরি করছিলাম যাতে প্রতিটি বোতামে কল করার জন্য আলাদা ফোন নম্বর প্রয়োজন। লুপের জন্য একটির মধ্যে বেশ কয়েকটি বোতাম তৈরি করার সময় আমি সেটট্যাগ ফাংশনটি ব্যবহার করেছি:

for (NSInteger i = 0; i < _phoneNumbers.count; i++) {

    UIButton *phoneButton = [[UIButton alloc] initWithFrame:someFrame];
    [phoneButton setTitle:_phoneNumbers[i] forState:UIControlStateNormal];

    [phoneButton setTag:i];

    [phoneButton addTarget:self
                    action:@selector(call:)
          forControlEvents:UIControlEventTouchUpInside];
}

তারপরে আমার কলটিতে: পদ্ধতিটি আমি লুপের জন্য একই ব্যবহার করেছি এবং সঠিক ফোন নম্বরটি বেছে নেওয়ার জন্য একটি আইএফ স্টেটমেন্ট:

- (void)call:(UIButton *)sender
{
    for (NSInteger i = 0; i < _phoneNumbers.count; i++) {
        if (sender.tag == i) {
            NSString *callString = [NSString stringWithFormat:@"telprompt://%@", _phoneNumbers[i]];
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]];
        }
    }
}

আপনি এই কোডটি উন্নত করতে পারেন:- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
লাডেসা

2

যেমন সমাধানের জন্য এখানে অনেকগুলি উপায় উল্লেখ করা হয়েছে, বিভাগ বৈশিষ্ট্য ব্যতীত।

আপনার পছন্দসই উপাদানটিতে সংজ্ঞায়িত (অন্তর্নির্মিত) উপাদানটি প্রসারিত করতে বিভাগ বৈশিষ্ট্যটি ব্যবহার করুন।

উদাহরণস্বরূপ (প্রাক্তন):

@interface UIButton (myData)

@property (strong, nonatomic) id btnData;

@end

আপনার ভিউতে Controller.m

 #import "UIButton+myAppLists.h"

UIButton *myButton = // btn intialisation....
 [myButton set btnData:@"my own Data"];
[myButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

অনুষ্ঠান পরিচালনাকারী:

-(void)buttonClicked : (UIButton*)sender{
    NSLog(@"my Data %@", sender. btnData);
}

আপনি প্রকৃত অর্থে বিভাগগুলিতে যুক্ত করতে পারবেন না।
হটফজজসুন্ডে

2

আপনি একটি ক্লোজার (অবজেক্টিভ-সি-তে ব্লক) দিয়ে একটি সহায়ক-ক্লোজার র‌্যাপার (ক্লোজারস্লিভ) যুক্ত করে এবং এটি নিয়ন্ত্রণের সাথে সম্পর্কিত বিষয় হিসাবে যুক্ত করে লক্ষ্য-ক্রিয়া প্রতিস্থাপন করতে পারেন যাতে এটি ধরে রাখা যায়। এইভাবে আপনি কোনও পরামিতি পাস করতে পারেন।

সুইফট 3

class ClosureSleeve {
    let closure: () -> ()

    init(attachTo: AnyObject, closure: @escaping () -> ()) {
        self.closure = closure
        objc_setAssociatedObject(attachTo, "[\(arc4random())]", self, .OBJC_ASSOCIATION_RETAIN)
    }

    @objc func invoke() {
        closure()
    }
}

extension UIControl {
    func addAction(for controlEvents: UIControlEvents, action: @escaping () -> ()) {
        let sleeve = ClosureSleeve(attachTo: self, closure: action)
        addTarget(sleeve, action: #selector(ClosureSleeve.invoke), for: controlEvents)
    }
}

ব্যবহার:

button.addAction(for: .touchUpInside) {
    self.switchToNewsDetails(parameter: i)
}

পদ্ধতির উপরে ( self.switchToNewsDetails(parameter: i)) 2 বার গুলি চালানো, আমাকে কেন সাহায্য করবে
নাগেন্দ্র

কোডটি আমার পক্ষে কাজ করে। একটি নতুন সিঙ্গল ভিউ অ্যাপ্লিকেশন পেস্টবিন . com /tPaqetMb পরীক্ষিত । সুতরাং সমস্যাটি সম্ভবত আপনার কোডে রয়েছে, button.addAction()দুবার কল করার মতো। button.addActionবন্ধের ভিতরে এবং প্রথম লাইনে একটি ব্রেকপয়েন্ট যুক্ত করুন এবং এটি নিজেই ডিবাগ করার চেষ্টা করুন।
মারিওন আর্নে

2

আর একটি উপায় আছে, যেখানে আপনি যে কক্ষে আপনার বোতামটি চাপছিলেন সেখানকার সূচকপথটি পেতে পারেন:

সাধারণ ক্রিয়া নির্বাচক যেমন:

 UIButton *btn = ....;
    [btn addTarget:self action:@selector(yourFunction:) forControlEvents:UIControlEventTouchUpInside];

এবং তারপরে আপনার ফাংশনে:

   - (void) yourFunction:(id)sender {

    UIButton *button = sender;
    CGPoint center = button.center;
    CGPoint rootViewPoint = [button.superview convertPoint:center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rootViewPoint];
    //the rest of your code goes here
    ..
}

যেহেতু আপনি একটি সূচকপথ পান এটি অনেক সহজ হয়ে ওঠে।


1

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

এনএসআইভোকেশন সম্পর্কিত আরও তথ্য এখানে

http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html


আসলে, আমি বেশ কয়েকটি প্যারাম পাস করতে চাই না, আমি কেবল একটি পূর্ণসংখ্যা চাই।
পিয়েরে এস্পেনান

প্রকৃতপক্ষে পারফরমেন্সসিটেক্টর রয়েছে: ওজেক্ট: উইড অবজেক্ট: পদ্ধতি যা 2 পরামিতি সহ নির্বাচকদের কল করতে দেয়। তবে আরও তথ্যের জন্য আপনার এনএসআইভোটেশন দরকার
ভ্লাদিমির

1

এটি আমার সমস্যাটিকে স্থির করে তবে আমি পরিবর্তন না করলে এটি ক্র্যাশ হয়ে যায়

action:@selector(switchToNewsDetails:event:)                 

প্রতি

action:@selector(switchToNewsDetails: forEvent:)              

0

আমি কাস্টমবাটনে UIButton সাবক্লাস করেছি এবং আমি যেখানে আমার ডেটা সঞ্চয় করি সেখানে একটি সম্পত্তি যুক্ত করেছি। সুতরাং আমি পদ্ধতিটি কল করি: (কাস্টমবটন *) প্রেরক এবং পদ্ধতিতে আমি কেবল আমার ডেটা প্রেরককে পড়ি yp মাইক্রোপার্টি।

কাস্টমবটন উদাহরণ:

@interface CustomButton : UIButton
@property(nonatomic, retain) NSString *textShare;
@end

পদ্ধতি ক্রিয়া:

+ (void) share: (CustomButton*) sender
{
    NSString *text = sender.textShare;
    //your work…
}

ক্রিয়া বরাদ্দ করুন

    CustomButton *btn = [[CustomButton alloc] initWithFrame: CGRectMake(margin, margin, 60, 60)];
    // other setup…

    btnWa.textShare = @"my text";
    [btn addTarget: self action: @selector(shareWhatsapp:)  forControlEvents: UIControlEventTouchUpInside];

0

আপনি যদি কেবল নতুন ভিউয়ের সাথে নেভিগেশন কন্ট্রোলার দ্বারা দেখানো বামবার্ট বাটন আইটেমটির জন্য পাঠ্যটি পরিবর্তন করতে চান তবে আপনি বর্তমান ভিউয়ের শিরোনামটি কেবলমাত্র পাঠ্য ভিউকন্ট্রোলারকে কাঙ্ক্ষিত পাঠ্যে কল করার আগে এবং ভবিষ্যতে প্রদর্শনের জন্য হ্যাসডাইস্পার্ড কলব্যাকটি পুনরুদ্ধার করতে পারেন may বর্তমান দৃশ্য

এই পদ্ধতির কার্যকারিতা (পপভিউ কনট্রোলার) এবং প্রদর্শিত তীরের উপস্থিতি অক্ষত রাখে।

এটি কমপক্ষে আইওএস 12, এক্সকোড 10.1 দিয়ে নির্মিত সাথে আমাদের জন্য কাজ করে ...


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