প্রস্তুতিফেরত সেগু পদ্ধতিতে সিগ আটকাবেন?


249

prepareForSegue:পদ্ধতিতে কোনও সেগু বাতিল করা সম্ভব ?

আমি সেগু করার আগে কিছু চেক করতে চাই এবং শর্তটি সত্য না হলে (এই ক্ষেত্রে, UITextFieldকিছুটি খালি থাকলে), সেগ সম্পাদনের পরিবর্তে একটি ত্রুটি বার্তা প্রদর্শন করুন।

উত্তর:


485

এটি আইওএস 6 এবং তার পরেও সম্ভব: আপনি পদ্ধতিটি প্রয়োগ করতে হবে

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

আপনার দর্শন নিয়ামক। আপনি সেখানে আপনার বৈধতা দিন, এবং যদি এটি ঠিক থাকে তবে return YES;যদি তা না হয় return NO;এবং প্রস্তুতিফেজু বলা হয় না।

নোট করুন যে প্রোগ্রামটিগতভাবে সেগগুলি ট্রিগার করার সময় এই পদ্ধতিটি স্বয়ংক্রিয়ভাবে কল হয় না। আপনার যদি চেকটি সম্পাদন করতে হয় তবে সেগ সম্পাদন করবেন কিনা তা নির্ধারণ করার জন্য আপনাকে shouldPerforSegueWithIdentifier কল করতে হবে।


106
এফওয়াইআই, যদি [সেল্ফ পারফরমেন্সসিথ উইথআইডেন্টিফায়ার: @ "সেগিআইডেন্টিফায়ার" প্রেরক: শূন্যপদে কল করে প্রোগ্রামটিগতভাবে সেগু ট্রিগার করা হয়; shouldPerforSegueWithIdentifier কল করা হবে না।
শহরবাসী

3
@ থেইডুড এটি উল্লেখ করার জন্য ধন্যবাদ। কোনও সমস্যা অনুসন্ধান করছে এবং এটি আমার ব্রেকপয়েন্টে আঘাত করছে না। কৌতূহলী যে কারও জন্য, একই ফলটি পেতে আপনার কেবল বিবৃতিতে আবৃত এই পদ্ধতিটি কল করতে হবে।
jpittman

1
@jpittman আপনি কি দয়া করে ব্যাখ্যা করতে পারবেন যদি একটি বিবৃতিতে আবৃত বলতে কী বোঝায়?
বোদা তালজো

7
@ আবুদাটালজো: (বিন্যাসের জন্য ক্ষমা চাই) if ([self shouldPerformSegueWithIdentifier:@"segueIdentifier" sender:nil]) { [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]; }
টিমমেডক্যাল্ফ

স্টোরিবোর্ড সেগু থেকে আইওএস 11.3 এসডিকে এই চেষ্টা করে এবং "shouldPerforSegueWithIdentifier" স্বয়ংক্রিয়ভাবে কল হয়েছিল
Menno

52

দ্রষ্টব্য: আপনি যদি আইওএস 6 টার্গেট করতে পারেন তবে গৃহীত উত্তর হ'ল সর্বোত্তম পদ্ধতি iOS

আমি বিশ্বাস করি না যে কোনও সিগ-ইন বাতিল করা সম্ভব prepareForSegue। আমি আপনার যুক্তিটিকে এমন বিন্দুতে সরানোর পরামর্শ দেব যে performSegueবার্তাটি প্রথমে প্রেরণ করা হয়েছে।

যদি আপনি ইন্টারফেস বিল্ডারকে সরাসরি নিয়ন্ত্রণে সিগ বেঁধে রাখার জন্য ব্যবহার করে থাকেন (যেমন, কোনও সিগিকে সরাসরি একটি এর সাথে সংযুক্ত করে UIButton), তবে আপনি কিছুটা রিফ্যাক্টরিং দিয়ে এটি সম্পাদন করতে পারেন। নির্দিষ্ট কন্ট্রোলের পরিবর্তে সেগটিকে ওয়্যার কন্ট্রোলারে রেখে দিন (পুরাতন সেগু লিঙ্কটি মুছুন এবং তারপরে ভিউ কন্ট্রোলার থেকে গন্তব্য দৃশ্যের নিয়ামকটিতে নিয়ন্ত্রণ-টেনে আনুন)। তারপরে IBActionআপনার ভিউ কন্ট্রোলারে একটি তৈরি করুন এবং নিয়ন্ত্রণটি আইবিএक्शनটিতে তারে দিন। তারপরে আপনি আপনার যুক্তিটি (খালি টেক্সটফিল্ডের জন্য পরীক্ষা করুন) আপনার সদ্য তৈরি করা আইবিএ ক্র্যাকশন করতে পারেন এবং অগ্রগতিগতভাবে বা না করার সিদ্ধান্ত নিতে পারেন performSegueWithIdentifier


যদি সেগটি কোনও পপওভার নিয়ামককে হয় তবে আপনি অন্য পপওভার নিয়ামক তৈরি করতে বোতামটির দ্বিতীয় ট্যাপটি চান না ; এক্ষেত্রে সঠিক কাজটি হ'ল পপওভারকে বরখাস্ত করা। আপনার উত্তর এই সঠিক আচরণের অনুমতি দেয়। আপনি যদি স্টোরিবোর্ডের বোতাম থেকে সরাসরি তারটি করেন তবে সঠিক আচরণ পেতে আমি আর দেখতে পাচ্ছি না।
wcochran

1
একসাথে বেশ ভাল খেলতে একাধিক সেগু-ভিত্তিক পপওভার পাওয়ার চেষ্টা করার কয়েক ঘন্টা হতাশার পরে, আমি হাল ছেড়ে দিয়ে এই সমাধানের পক্ষে পপওভার সিকোয়েন্স থেকে মুক্তি পেয়েছি। এটি আসলে কম কোড ব্যবহার করে।
এমপেমবার্ন

এটি কি segues থাকার উদ্দেশ্যকে পরাভূত করবে না?
ক্রিশ্তিক

ভিউ কন্ট্রোলারকে ভিউকন্ট্রোলারের সাথে লিঙ্ক করার বিষয়টি আমার সমস্যার সমাধান করে। ধন্যবাদ! এটি সেরা সমাধান
ডঃ টিজে

19

সুইফট 3 : মজাদার কাঁধে পারফর্মসেটিক (আইডেন্টিফায়ার শনাক্তকারী: স্ট্রিং, প্রেরক: কোনও?) -> বুল

ফেরত মান সত্য যদি সেগ সম্পাদন করা উচিত বা মিথ্যা যদি তা উপেক্ষা করা উচিত।

উদাহরণ :

var badParameters:Bool = true

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if badParameters  {
         // your code here, like badParameters  = false, e.t.c
         return false
    }
    return true
}

12

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

- (IBAction)nameChanged:(id)sender {
    UITextField *text = (UITextField*)sender;
    [nextButton setEnabled:(text.text.length != 0)];
}

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

11

দ্রুত গতিতে এটি সহজ।

override func shouldPerformSegueWithIdentifier(identifier: String,sender: AnyObject?) -> Bool {

    return true
}

3
তাই না? আপনি কি এই উত্তরটি আরও ব্যাখ্যা করতে পারেন? কোড-কেবল উত্তরগুলি পরবর্তী পাঠকদের জন্য খুব কার্যকর নয় ...
ক্রিশ্চিক

9

যেমনটি ইব্রাহিম বলেছেন, নীচের ফাংশনে বৈধ কিনা তা পরীক্ষা করে দেখুন।

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender
{
     // Check this identifier is OK or NOT.
}

এবং, performSegueWithIdentifier:sender:প্রোগ্রামিং দ্বারা ডাকা নিম্নলিখিত পদ্ধতিতে ওভাররাইট করে ব্লক করা যেতে পারে। ডিফল্টরূপে এটি বৈধ কিনা তা যাচাই বাছাই করছে না -shouldPerformSegueWithIdentifier:sender:, আমরা এটি ম্যানুয়ালি করতে পারি।

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    // Check valid by codes
    if ([self shouldPerformSegueWithIdentifier:identifier sender:sender] == NO) {
        return;
    }

    // If this identifier is OK, call `super` method for `-prepareForSegue:sender:` 
    [super performSegueWithIdentifier:identifier sender:sender];
}

এই অংশটি [super performSegueWithIdentifier:identifier sender:sender];কি আসলেই সত্য?
বেন হুইলার

আপনি এটি চেষ্টা করতে পারেন আপনি যদি performSegueWithIdentifier:sender:পদ্ধতিটিকে ওভাররাইড করে থাকেন এবং এটির superপদ্ধতিটিকে কল না করেন ।
AechoLiu

5

লগইন নিবন্ধের জন্য Segue সঞ্চালন করা উচিত

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{

    [self getDetails];

    if ([identifier isEqualToString:@"loginSegue"])
    {

        if (([_userNameTxtf.text isEqualToString:_uname])&&([_passWordTxtf.text isEqualToString:_upass]))
        {

            _userNameTxtf.text=@"";
            _passWordTxtf.text=@"";

            return YES;
        }
        else
        {
            UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"Invalid Details" delegate:self cancelButtonTitle:@"Try Again" otherButtonTitles:nil];

            [loginAlert show];

            _userNameTxtf.text=@"";
            _passWordTxtf.text=@"";

            return NO;
        }

    }

    return YES;

}

-(void)getDetails
{
    NSArray *dir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *dbpath=[NSString stringWithFormat:@"%@/userDb.sqlite",[dir lastObject]];

    sqlite3 *db;

    if(sqlite3_open([dbpath UTF8String],&db)!=SQLITE_OK)
    {
        NSLog(@"Fail to open datadbase.....");
        return;
    }

    NSString *query=[NSString stringWithFormat:@"select * from user where userName = \"%@\"",_userNameTxtf.text];

    const char *q=[query UTF8String];

    sqlite3_stmt *mystmt;

    sqlite3_prepare(db, q, -1, &mystmt, NULL);

    while (sqlite3_step(mystmt)==SQLITE_ROW)
    {
        _uname=[NSString stringWithFormat:@"%s",sqlite3_column_text(mystmt, 0)];

        _upass=[NSString stringWithFormat:@"%s",sqlite3_column_text(mystmt, 2)];
    }

    sqlite3_finalize(mystmt);
    sqlite3_close(db);

}

4

কওলিনের উত্তরের অনুরূপ হ'ল নিয়ন্ত্রণটিকে তারযুক্ত ত্যাগ করতে হবে তবে দৃশ্যের শর্তের ভিত্তিতে নিয়ন্ত্রণটিকে বৈধতা দেওয়া উচিত। আপনি যদি টেবিল কক্ষের মিথস্ক্রিয়ায় গুলি চালিয়ে যাচ্ছেন তবে আপনার ঘরে ব্যবহারকারী স্টাফটি অক্ষম করার পাশাপাশি ইউজারটাইজএইএলভেড প্রপার্টিও সেট করতে হবে।

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

-(void)validateFilterPicker
{
    if (micSwitch.on)
    {
        filterPickerCell.textLabel.enabled = YES;
        filterPickerCell.detailTextLabel.enabled = YES;
        filterPickerCell.userInteractionEnabled = YES;
        filterPickerCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else
    {
        filterPickerCell.textLabel.enabled = NO;
        filterPickerCell.detailTextLabel.enabled = NO;
        filterPickerCell.userInteractionEnabled = NO;
        filterPickerCell.accessoryType = UITableViewCellAccessoryNone;
    }

}

4

সুইফট 4 উত্তর:

নিম্নলিখিতটি সিগুড বাতিল করতে সুইফট 4 বাস্তবায়ন:

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if identifier == "EditProfile" {
        if userNotLoggedIn {
            // Return false to cancel segue with identified Edit Profile
            return false
        }
    }
    return true
}

2

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

 func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        if showDetails() {
                return indexPath            
        }
        return nil
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.