আইওএস - সুইফট ব্যবহার করে প্রোগ্রামাগুলিভাবে কীভাবে সিগ করতে হবে


185

আমি এমন একটি অ্যাপ তৈরি করছি যা ব্যবহারকারীদের প্রমাণীকরণের জন্য ফেসবুক এসডিকে ব্যবহার করে। আমি পৃথক শ্রেণিতে ফেসবুক যুক্তি সংহত করার চেষ্টা করছি। এখানে কোড (সরলতার জন্য ছিনিয়ে নেওয়া):

import Foundation

class FBManager {
    class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){
        //... handling all session states
        FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in

            println("Logged in user: \n\(result)");

            let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
            let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController

            loggedInView.result = result;

            //todo: segue to the next view???
        }
    }
}

আমি উপরোক্ত শ্রেণীর পদ্ধতিটি সেশনের স্থিতি পরিবর্তনগুলি পরীক্ষা করতে ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে।

প্রশ্ন: একবার ব্যবহারকারীর ডেটা হয়ে গেলে আমি কীভাবে এই কাস্টম শ্রেণীর মধ্যে থেকে পরবর্তী দৃশ্যে সিগন করতে পারি?

সম্পাদনা: স্পষ্ট করে বলার জন্য, স্টোরিবোর্ডে শনাক্তকারীদের সাথে আমার একটি সেগ আছে, এবং আমি এমন কোনও শ্রেণীর কাছ থেকে সেগ সম্পাদন করার উপায় খুঁজে বের করার চেষ্টা করছি যা ভিউ কন্ট্রোলার নয় from


2
পছন্দ performSegue:?
রয়েছে

হ্যাঁ, তবে কোডটি ভিউকন্ট্রোলারে নেই, আমি কীভাবে এটি অর্জন করতে পারি?
Shlomi শোয়ার্জ

ভাল, সেক্ষেত্রে আপনার সেই কাজটি (সেগিং) হ'ল ভিউ কন্ট্রোলারে (সম্পূর্ণকরণ ব্লক বা প্রতিনিধি পদ্ধতির মাধ্যমে) আপনি যে কাজটি করছেন তা থেকে তাকে অর্পণ করা উচিত।
রয়েছে

নন লেল ব্যতীত ব্যতিক্রম হচ্ছে
ক্রিস হেইস

উত্তর:


340

যদি আপনার দুটি ভিউয়ের মধ্যে একটি সেগু শনাক্তকারী সহ স্টোরিবোর্ডে যদি আপনার সেগ বিদ্যমান থাকে তবে আপনি কেবল প্রোগ্রাম ব্যবহার করে এটি কল করতে পারেন:

performSegue(withIdentifier: "mySegueID", sender: nil)

পুরানো সংস্করণগুলির জন্য:

performSegueWithIdentifier("mySegueID", sender: nil)

আপনি এছাড়াও করতে পারেন:

presentViewController(nextViewController, animated: true, completion: nil)

অথবা আপনি যদি কোনও নেভিগেশন নিয়ন্ত্রকের মধ্যে থাকেন:

self.navigationController?.pushViewController(nextViewController, animated: true)

7
উত্তরের জন্য ধন্যবাদ, আমি কীভাবে কোনও কাস্টম ক্লাস থেকে পারফরমেশনসথথআইডেন্টিফায়ারকে কল করব?
শ্লোমি শোয়ার্জ

2
আমি যদি আপনার দ্বিতীয় পদ্ধতিটি ব্যবহার করি। কিভাবে পরবর্তী ভিউতে ডেটা পাস করবেন?
আইম্প্রেম

2
আপনি ফানক রেফারেন্সফোরসিগ ব্যবহার করবেন (সেগ: ইউআইএসটিরিবোর্ডসিগ, প্রেরক: যেকোনওজেক্ট?) এবং বৈশিষ্ট্যগুলি সেট করুন।
লয়েড সারজেন্ট

1
নোট করুন যখন পারফরম্যাসিক উইথআইডেন্টিফার () কল করার সময় আপনার কলিং কন্ট্রোলারে রেফারফিউসারিক () এর একটি বাস্তবায়ন কল করা হবে এবং আপনি সেখানে বিভিন্ন ডেটা পাসিং করতে পারবেন - বাস্তবে, প্রিফারফেসেক () তে প্রাপ্ত প্রেরক পরামিতি কেবল প্রেরক প্যারামিটারে পাস করা হয় is परফরমসিজউইথআইডিটিফায়ার ()
টিম্বো

1
স্টুবোর্ডে যদি সেগের অস্তিত্ব না থাকে তবে কী হবে? উদাহরণস্বরূপ, আপনি যদি ভিউকন্ট্রোলার নিজেই কোনও সেগ তৈরি করতে চান?
scaryguy

20

আপনি এনএসএনটিফিকেশন ব্যবহার করতে পারেন

আপনার কাস্টম শ্রেণিতে একটি পোস্ট পদ্ধতি যুক্ত করুন:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

আপনার ভিউকন্ট্রোলারে একটি পর্যবেক্ষক যুক্ত করুন:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)

আপনার সাথে ফাংশন যুক্ত করুন ViewController:

func methodOFReceivedNotication(notification: NSNotification){
    self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}

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

17

যদি আপনার দুটি ভিউয়ের মধ্যে একটি সেগু শনাক্তকারী সহ স্টোরিবোর্ডে আপনার সেগ বিদ্যমান থাকে, তবে আপনি কেবল প্রোগ্রামিকভাবে এটি ব্যবহার করে কল করতে পারেন

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

আপনি যদি নেভিগেশন কন্ট্রোলারে থাকেন

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)        
self.navigationController?.pushViewController(viewController, animated: true)

আমি নেভিগেশন নিয়ামক ব্যবহার করে দ্বিতীয় পদ্ধতির জন্য আপনাকে সুপারিশ করব।


self.performSegue (withIdentifier: "yourIdentifierInStoryboard", প্রেরক: স্ব)
Rajneesh071

14

আপনি এইভাবে সিগু ব্যবহার করতে পারেন:

self.performSegueWithIdentifier("push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "push" {

    }
}

জবাবের জন্য ধন্যবাদ, তবে পারফরম্যান্সসিগুইথইডেন্টিফায়ার একটি ভিউ কনট্রোলার পদ্ধতি এবং আমার কোডটি একটি বাহ্যিক শ্রেণিতে চালিত হয়
Shlomi Schwartz

13

সুইফট 3 - এছাড়াও স্প্রিটকিটের সাথে কাজ করে

আপনি এনএসএনটিফিকেশন ব্যবহার করতে পারেন ।

উদাহরণ:

1.) স্টোরিবোর্ডে একটি সিগ তৈরি করুন এবং সনাক্তকারীটির নাম "সেগু"

২) আপনি যে ভিউ কন্ট্রোলার থেকে সেল করছেন সেগুলিতে একটি ফাংশন তৈরি করুন।

func goToDifferentView() {

    self.performSegue(withIdentifier: "segue", sender: self)

}

৩) আপনার ভিউকন্ট্রোলারের ভিউডিডডলোড () এ আপনি পর্যবেক্ষক তৈরি করা থেকে বিরত আছেন।

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

আপডেট - শেষবার আমি এটি ব্যবহার করার সময় .addObserverত্রুটিগুলি নিঃশব্দ করার জন্য আমাকে নিম্নলিখিত কোডটিতে কলটি পরিবর্তন করতে হয়েছিল।

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

৪) আপনি যে ভিউকন্ট্রোলার বা দৃশ্যের সাথে নিযুক্ত রয়েছেন সেখানে সেগটি ট্রিগার করতে আপনি যেখানে চান সেখানে পোস্ট পদ্ধতি যুক্ত করুন।

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)

আপডেট - শেষবার আমি এটি ব্যবহার করার সময় .postত্রুটিগুলি নিঃশব্দ করার জন্য আমাকে নিম্নলিখিত কোডটিতে কলটি পরিবর্তন করতে হয়েছিল।

NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)

সুইফট 3:NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
মাইকেল সাময়লোভ

3

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

func localFunc() {
    println("we asked you to do it")
    performSegueWithIdentifier("doIt", sender: self)
}

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

public class UtilClass {

    var yourFunction : () -> ()

    init (someFunction: () -> ()) {
        self.yourFunction = someFunction
        println("initialized UtilClass")
    }

    public convenience init() {
        func dummyLog () -> () {
            println("no action passed")
        }
        self.init(dummyLog)
    }

    public func doThatThing() -> () {
        // the facebook login function
        println("now execute passed function")
        self.yourFunction()
        println("did that thing")
    }
}

(সুবিধাযুক্ত উদ্যোগটি আপনাকে সেগটি কার্যকর না করে ইউনিট পরীক্ষায় এটি ব্যবহার করতে দেয়))

শেষ অবধি, যেখানে আপনার // টোডো রয়েছে: পরবর্তী দর্শনটিতে সিগ করুন ???, এর লাইনে কিছু রেখে দিন:

self.yourFunction()

আপনার ইউনিট পরীক্ষাগুলিতে, আপনি এটিকে কেবল এইভাবে প্রার্থনা করতে পারেন:

let f = UtilClass()
f.doThatThing()

যেখানে doThatTering আপনার fbsessionstatechange এবং UtilClassএফবিম্যানেজার।

আপনার আসল কোডের জন্য, কেবল localFuncএফবিম্যানেজার শ্রেণিতে পাস করুন (কোনও প্রথম বন্ধনী নেই)।


2

এটি আমার পক্ষে কাজ করেছে।

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

let viewController:
UIViewController = UIStoryboard(
    name: "Main", bundle: nil
).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject!
// this must be downcast to utilize it

self.presentViewController(viewController, animated: false, completion: nil)

আরও তথ্যের জন্য দেখুন http://sketchytech.blogspot.com/2012/11/instantiate-view-controller- using.html শুভেচ্ছা


1

আপনি এই জিনিসটি performSegueWithIdentifierফাংশন ব্যবহার করে করতে পারেন ।

স্ক্রিনশট

বাক্য গঠন :

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

উদাহরণ:

 performSegueWithIdentifier("homeScreenVC", sender: nil)

1

অন্য বিকল্পটি হল মডেল সেগু ব্যবহার করা

পদক্ষেপ 1: স্টোরিবোর্ডে যান, এবং দেখুন কন্ট্রোলারকে একটি স্টোরিবোর্ড আইডি দিন । ডানদিকে পরিচয় পরিদর্শকটিতে স্টোরিবোর্ড আইডিটি কোথায় পরিবর্তন করতে হবে তা খুঁজে পেতে পারেন। স্টোরিবোর্ড আইডি কল করতে দিনModalViewController

পদক্ষেপ 2: 'প্রেরক' ভিউ কন্ট্রোলার খুলুন (আসুন এটি কল করুন ViewController) এবং এটিতে এই কোডটি যুক্ত করুন

public class ViewController {
  override func viewDidLoad() {
    showModalView()
  }

  func showModalView() {
    if let mvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ModalViewController") as? ModalViewController {
      self.present(mvc, animated: true, completion: nil)
    }
  }
}

নোট করুন যে আমরা যে ভিউ কন্ট্রোলারটি খুলতে চাইছি তাকেও ডাকা হয় ModalViewController

পদক্ষেপ 3: মডেলভিউ নিয়ন্ত্রণকারীকে বন্ধ করতে এটিতে এটি যুক্ত করুন

public class ModalViewController {
   @IBAction func closeThisViewController(_ sender: Any?) {
      self.presentingViewController?.dismiss(animated: true, completion: nil)
   }
}

0

এটি আমার পক্ষে কাজ করেছে:

//Button method example
 @IBAction func LogOutPressed(_ sender: UIBarButtonItem) {

        do {
            try Auth.auth().signOut()
            navigationController?.popToRootViewController(animated: true)

        } catch let signOutError as NSError {
          print ("Error signing out: %@", signOutError)
        }


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