मैं स्टोरीबोर्ड का उपयोग किए बिना एक नई स्विफ्ट परियोजना कैसे बनाऊं?


107

XCode 6 में एक नया प्रोजेक्ट बनाना स्टोरीबोर्ड को अक्षम करने की अनुमति नहीं देता है। आप केवल स्विफ्ट या ऑब्जेक्टिव-सी का चयन कर सकते हैं और कोर डेटा का उपयोग या नहीं कर सकते हैं।

मैंने स्टोरीबोर्ड को हटाने की कोशिश की और प्रोजेक्ट से मुख्य स्टोरीबोर्ड को हटा दिया और मैन्युअल रूप से विंडो को सेट नहीं किया।

AppDelegate में मेरे पास यह है:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow
var testNavigationController: UINavigationController

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

        testNavigationController = UINavigationController()
        var testViewController: UIViewController = UIViewController()
        self.testNavigationController.pushViewController(testViewController, animated: false)

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        self.window.rootViewController = testNavigationController

        self.window.backgroundColor = UIColor.whiteColor()

        self.window.makeKeyAndVisible()

        return true
    }
}

हालाँकि, XCode मुझे एक त्रुटि देता है:

क्लास Class ऐपडेलगेट ’के पास कोई शुरुआती नहीं है

इसमें कोई सफल हुआ है?


जवाबों:


71

आपको वैकल्पिक के रूप में वेरिएबल windowऔर मार्क करना चाहिए testNavigationController:

var window : UIWindow?
var testNavigationController : UINavigationController?

स्विफ्ट कक्षाओं को तात्कालिकता के दौरान गैर-वैकल्पिक गुणों की आवश्यकता होती है:

उस वर्ग या संरचना का निर्माण होने तक वर्गों और संरचनाओं को उनके सभी संग्रहीत गुणों को एक उचित प्रारंभिक मूल्य पर सेट करना होगा। एक अनिश्चित स्थिति में संग्रहीत संपत्तियों को नहीं छोड़ा जा सकता है।

वैकल्पिक प्रकार के गुणों को स्वचालित रूप से शून्य के मूल्य के साथ आरंभीकृत किया जाता है, यह दर्शाता है कि प्रॉपर्टी को जानबूझकर प्रारंभ के दौरान "अभी तक कोई मूल्य नहीं" देने का इरादा है।

वैकल्पिक चर का उपयोग करते समय, उन्हें उनके साथ अनचेक करना न भूलें !, जैसे:

self.window!.backgroundColor = UIColor.whiteColor();

1
सब कुछ अंत तक आपके जवाब में सही समझ में आता है। क्या आप उस अंतिम भाग की व्याख्या करेंगे? खोलना? क्या यह आवश्यक है?
दनमोर

1
आप अपने में एक गैर-वैकल्पिक संपत्ति को संग्रहीत नहीं कर सकते हैं AppDelegate(जब तक कि यह आरंभीकरण के दौरान कोई मूल्य नहीं है, या यह आलसी रूप से हल हो गया है)। यदि आप एक वैकल्पिक संपत्ति संग्रहीत करते हैं और आपको यकीन है कि यह नहीं है nil, तो आप !ऑपरेटर का उपयोग करके "इसकी वैकल्पिकता से इसे हटा दें" ।
akashivskyy

क्या सबसे अच्छा अभ्यास है, स्व। या अगर खिड़की का उपयोग कर = ..?
हंसी का

1
यदि आप सुनिश्चित हैं कि आपकी खिड़की मौजूद है (और आप इस विशेष मामले में सुनिश्चित हो सकते हैं), तो आप साथ जा सकते हैं !
akashivskyy

तो इसका मतलब यह है कि जब हम स्टोरीबोर्ड का उपयोग करते हैं, तो बैकग्राउंडर इसे किसी भी तरह से डिफ़ॉल्ट कर देता है .white?
हनी

91

सभी के लिए Storyboards का उपयोग नहीं करने के लिए यह लेता है rootViewController:

1 · इसमें बदलें AppDelegate.swift:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        if let window = window {
            window.backgroundColor = UIColor.white
            window.rootViewController = ViewController()
            window.makeKeyAndVisible()
        }
        return true
    }
}

2 · का एक ViewControllerउपवर्ग बनाएँ UIViewController:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }
}

3 · यदि आपने Xcode टेम्पलेट से प्रोजेक्ट बनाया है:

  1. कुंजी के लिए कुंजी-मान पेयर निकालें "Main storyboard file base name"से Info.plist
  2. स्टोरीबोर्ड फ़ाइल को हटाएं Main.storyboard

जैसा कि आप पहले कोड स्निपेट में देख सकते हैं, इसके बजाय एक वैकल्पिक रूप से अलंकृत करने के बजाय, मुझे if letवैकल्पिक windowसंपत्ति को अलंकृत करने के लिए वाक्यविन्यास पसंद है । यहाँ मैं इसका उपयोग इस तरह से कर रहा हूँ if let a = a { }ताकि वैकल्पिक aएक ifही नाम के साथ -statement के अंदर एक गैर-वैकल्पिक संदर्भ बन जाए - a

अंत self.में आवश्यक नहीं है जब windowइसके अंदर की संपत्ति का संदर्भ दिया जाए ।


1
क्यों if let window = window {? मैं यह समझ गया! ऐसा इसलिए है कि आपको window!हर बार उपयोग करने की आवश्यकता नहीं है ।
बिलाल अकिल

@ 2unco मुझे खुशी है कि आपने इसका पता लगा लिया। यह मेरे उत्तर के अंतिम भाग में वर्णित है if let a = a {}
टोबियासमंद

मैं सेटिंग के बादmakeKeyAndVisible() होने वाली कॉल को स्थानांतरित करूंगा । अन्यथा आपको इस बारे में एक चेतावनी मिलेगी कि विंडो को एप्लिकेशन लॉन्च के अंत में रूट व्यू कंट्रोलर की अपेक्षा कैसे की जाती है। rootViewController
सेबेस्टियन मार्टिन 18

if let a = a { }अजीब दिखता है। क्या आप सुनिश्चित हैं कि गैर-वैकल्पिक संदर्भ के लिए समान चर नाम का उपयोग करना ठीक है? Apple हमेशा अपने स्विफ्ट डॉक्स में विभिन्न नामों का उपयोग करता है। इसके अलावा, window!हर बार इस्तेमाल करने से यह बेहतर क्यों है ?
ma11hew28

1. if let a = a { }पूरी तरह से ठीक है। आप इसका उपयोग कर सकते हैं if let anA = a { }यदि यह आपको अधिक आरामदायक महसूस कराता है। 2. window!एक रनटाइम चेक है जब से आप एक वैकल्पिक रूप से स्पष्ट रूप से अलिखित करते हैं। मुझे संकलन समय पसंद है कि स्विफ्ट हमें प्रदान करता है, इसलिए इसका उपयोग क्यों न करें।
तोबसीडीएम

13

यदि आप xib के साथ अपने viewController को इनिशियलाइज़ करना चाहते हैं और नेविगेशन कंट्रोलर का उपयोग करने की आवश्यकता है। यहाँ एक कोड है।

var window: UIWindow?
var navController:UINavigationController?
var viewController:ViewController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    viewController = ViewController(nibName: "ViewController", bundle: nil);
    navController = UINavigationController(rootViewController: viewController!);

    window?.rootViewController = navController;
    window?.makeKeyAndVisible()

    return true
}

6

निम्नलिखित कोड का प्रयास करें:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window!.backgroundColor = UIColor.whiteColor()

    // Create a nav/vc pair using the custom ViewController class

    let nav = UINavigationController()
    let vc = NextViewController ( nibName:"NextViewController", bundle: nil)

    // Push the vc onto the nav
    nav.pushViewController(vc, animated: false)

    // Set the window’s root view controller
    self.window!.rootViewController = nav

    // Present the window
    self.window!.makeKeyAndVisible()
    return true

}

2

मुझे जवाब मिल गया है कि इसका xcode सेटअप से कोई लेना-देना नहीं था, स्टोरीबोर्ड को हटाना और प्रोजेक्ट से संदर्भ सही बात है। यह स्विफ्ट सिंटैक्स के साथ करना था।

कोड निम्नलिखित है:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var testNavigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

        self.testNavigationController = UINavigationController()
        var testViewController: UIViewController? = UIViewController()
        testViewController!.view.backgroundColor = UIColor.redColor()
        self.testNavigationController!.pushViewController(testViewController, animated: false)

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        self.window!.rootViewController = testNavigationController

        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        return true
    }

}

लेकिन अपने प्रश्न का उत्तर क्यों दें, यदि समाधान दूसरे उत्तर में है?
आकाशवाणी

पृष्ठ अपडेट नहीं किया गया था और मैंने उत्तर नहीं देखा, केवल पोस्ट करने के बाद
EhTd

2

आप इसे इस तरह से कर सकते हैं:

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    var IndexNavigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        var IndexViewContoller : IndexViewController? = IndexViewController()
        self.IndexNavigationController = UINavigationController(rootViewController:IndexViewContoller)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = self.IndexNavigationController
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()
        return true
    }
}

क्या var विंडो: UIWindow? निर्दिष्ट करें कि यह एक वैकल्पिक संपत्ति है?
सीन डनफोर्ड

वैसे मैंने इसके बिना ऐप प्रतिनिधि में एक दूसरा संस्करण जोड़ने की कोशिश की और मेरे उपरोक्त कथन को सही पाया।
सीन डनफोर्ड

2

मैं आपको नियंत्रक और xib का उपयोग करने की सलाह देता हूं

MyViewController.swift तथा MyViewController.xib

(आप फ़ाइल के माध्यम से बना सकते हैं-> नई-> फाइल-> कोको टच क्लास और सेट "भी XIB फ़ाइल बनाएँ" सच, UIViewController के उप वर्ग)

class MyViewController: UIViewController {
   .....    
}

और AppDelegate.swift func applicationनिम्नलिखित कोड लिखने के लिए

....
var controller: MyViewController = MyViewController(nibName:"MyViewController",bundle:nil)
self.window!.rootViewController = controller
return true

यह काम होना चाहिए!


मैंने उसी तरह की कोशिश की जिसका आपने उल्लेख किया था लेकिन त्रुटि: अनकैप्ड अपवाद 'NSInternalInconsistencyException' अपवाद के कारण समाप्ति एप्लिकेशन, कारण: 'बंडल में NIB को लोड नहीं किया जा सका:
16:25 पर shripad20


2

अपडेट: स्विफ्ट 5 और आईओएस 13:

  1. एक सिंगल व्यू एप्लिकेशन बनाएं।
  2. हटाएँ Main.storyboard (राइट क्लिक करें और हटाएं)।
  3. फ़ाइल में डिफ़ॉल्ट दृश्य कॉन्फ़िगरेशन से स्टोरीबोर्ड का नाम हटाएं Info.plist:यहां छवि विवरण दर्ज करें
  4. से खोलें SceneDelegate.swiftऔर बदलें func scene:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    guard let _ = (scene as? UIWindowScene) else { return }
}

सेवा

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).x

    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = ViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}

1

यहाँ एक UINavigationController के लिए एक पूर्ण स्विफ्ट परीक्षण उदाहरण है

        import UIKit
        @UIApplicationMain
        class KSZAppDelegate: UIResponder, UIApplicationDelegate {    
          var window: UIWindow?
          var testNavigationController: UINavigationController?

          func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            // Override point for customization after application launch.        
            // Working WITHOUT Storyboard
            // see http://randexdev.com/2014/07/uicollectionview/
            // see http://stackoverflow.com/questions/24046898/how-do-i-create-a-new-swift-project-without-using-storyboards
            window = UIWindow(frame: UIScreen.mainScreen().bounds)
            if let win = window {
              win.opaque = true    
            //you could create the navigation controller in the applicationDidFinishLaunching: method of your application delegate.    
              var testViewController: UIViewController = UIViewController()
              testNavigationController = UINavigationController(rootViewController: testViewController)
              win.rootViewController = testNavigationController
              win.backgroundColor = UIColor.whiteColor()
              win.makeKeyAndVisible()
// see corresponding Obj-C in https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html#//apple_ref/doc/uid/TP40011313-CH2-SW1
        //      - (void)applicationDidFinishLaunching:(UIApplication *)application {
        //    UIViewController *myViewController = [[MyViewController alloc] init];
        //    navigationController = [[UINavigationController alloc]
        //                                initWithRootViewController:myViewController];
        //    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        //    window.rootViewController = navigationController;
        //    [window makeKeyAndVisible];
            //}
            }
            return true
          }
    }

0

आप केवल एक खाली एप्लिकेशन क्यों नहीं बनाते हैं? स्टोरीबोर्ड मुझे नहीं बनाया गया है ...


0

हम Xcode 6 (iOS 8) में स्टोरीबोर्ड के बिना नेविगेशन-आधारित एप्लिकेशन बना सकते हैं जैसे कि:

  • प्रोजेक्ट भाषा को स्विफ्ट के रूप में चुनकर एक खाली एप्लिकेशन बनाएं।

  • इंटरफ़ेस xib के साथ नई कोको टच क्लास फाइलें जोड़ें। (उदाहरण। TestViewController)

  • स्विफ्ट में हमारे पास xib यानी * .swift फाइल के साथ केवल एक फाइल इंटरैक्ट है, कोई .h और .m फाइल नहीं है।

  • हम xib के नियंत्रण को स्विफ्ट फ़ाइल के साथ iOS 7 में जोड़ सकते हैं।

नियंत्रण और स्विफ्ट के साथ काम के लिए कुछ स्निपेट निम्नलिखित हैं

//
//  TestViewController.swift
//

import UIKit

class TestViewController: UIViewController {

    @IBOutlet var testBtn : UIButton

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        // Custom initialization
    }

    @IBAction func testActionOnBtn(sender : UIButton) {
        let cancelButtonTitle = NSLocalizedString("OK", comment: "")

        let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert)

        // Create the action.
        let cancelAction = UIAlertAction(title: cancelButtonTitle, style: .Cancel) { action in
            NSLog("The simple alert's cancel action occured.")
        }

        // Add the action.
        alertController.addAction(cancelAction)

        presentViewController(alertController, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

AppDelegate.swift फ़ाइल में परिवर्तन

//
//  AppDelegate.swift
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var navigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        var testController: TestViewController? = TestViewController(nibName: "TestViewController", bundle: nil)
        self.navigationController = UINavigationController(rootViewController: testController)
        self.window!.rootViewController = self.navigationController

        return true
    }

    func applicationWillResignActive(application: UIApplication) {
}

    func applicationDidEnterBackground(application: UIApplication) {
    }

    func applicationWillEnterForeground(application: UIApplication) {
    }

    func applicationDidBecomeActive(application: UIApplication) {
    }

    func applicationWillTerminate(application: UIApplication) {
    }

}

Http://ashishkakkad.wordpress.com/2014/06/16/create-a-application-in-xcode-6-ios-8-without-storyborard-in-swift-language-and पर कोड नमूना और अन्य जानकारी प्राप्त करें के काम-साथ-नियंत्रण /


0

IOS 13 और इसके बाद के संस्करण में जब आप स्टोरीबोर्ड के बिना नए प्रोजेक्ट बनाते हैं तो नीचे दिए गए चरणों का उपयोग करें:

  1. Xcode 11 या इसके बाद के संस्करण का उपयोग करके प्रोजेक्ट बनाएं

  2. स्टोरीबोर्ड निब और कक्षा हटाएं

  3. Xib के साथ नई नई फ़ाइल जोड़ें

  4. रूट व्यू को UINavigationController SceneDelegate के रूप में सेट करने की आवश्यकता है

  5. नीचे कोड फ़ंक दृश्य (_ दृश्य: UIScene, willConnectTo सत्र: UISceneSession, विकल्प कनेक्शन: UIScene.ConnectionOptions) जोड़ें: // // इस विधि का उपयोग वैकल्पिक रूप से UIWindowScene में UIWindow windowको कॉन्फ़िगर करने और संलग्न करने के लिए करें scene। // यदि स्टोरीबोर्ड का उपयोग किया जाता है, तो windowसंपत्ति स्वचालित रूप से प्रारंभिक हो जाएगी और दृश्य से जुड़ी होगी। // यह डेलीगेट कनेक्टिंग सीन या सेशन को नया नहीं मानता (इसके application:configurationForConnectingSceneSessionबजाय देखें )। // गार्ड लेट _ = (जैसा? यूआईविंडो सीन) और {{}

    अगर खिड़की = दृश्य के रूप में जाने दें? UIWindowScene {self.window = UIWindow (windowScene: windowScene) mainController = HomeViewController () को होम व्यू कॉन्ट्रोलर के रूप में जाने दें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.