2014-09-26 17 views
14

मेरे पास एक प्रोजेक्ट है जो उद्देश्य सी में है, मेरे दृश्य नियंत्रक को छोड़कर, जो स्विफ्ट में है।लोड किया गया निब लेकिन दृश्य आउटलेट सेट नहीं किया गया था - स्विफ्ट संस्करण

जब मैंने इसे चलाने के लिए, मैं न आया हुआ अपवाद 'NSInternalInconsistencyException', कारण की वजह से त्रुटि

समाप्त एप्लिकेशन प्राप्त करें: '- [UIViewController _loadViewFromNibNamed: बंडल:] "..." निब भरी हुई लेकिन दृश्य आउटलेट सेट नहीं किया गया था। '

तो मैंने अपनी निब फ़ाइल खोल दी, "फ़ाइल के मालिक" को देखो, और मुझे लगता है कि दृश्य बिल्कुल आउटलेट के रूप में भी दिखाई नहीं देता है।
मेरे पुराने दृश्य नियंत्रक (उद्देश्य सी) के लिए, व्यू आउटलेट दिखाया गया है।

मेरी स्विफ्ट दृश्य नियंत्रक में, मैं इसे एक @IBOutlet होने के लिए मजबूर करने के लिए UIViewController से "दृश्य" चर अधिभावी की कोशिश की है, लेकिन इसके बारे में प्रकार UIView के "दृश्य" चर जा रहा है शिकायत की, UIView के बारे में शिकायत ?, और UIView के बारे में शिकायत की!

यहाँ

मेरी AppDelegate.h

#import <UIKit/UIKit.h> 

@class MyViewController; 
@class MyViewControllerSwift; 

@interface MSAppDelegate : UIResponder <UIApplicationDelegate> 
{ 
} 

@property (strong, nonatomic) UIWindow *window; 

@property (strong, nonatomic) UIViewController *viewController; 

@end 

का सरलीकृत संस्करण AppDelegate.m

#import "MyAppDelegate.h" 

#import "MyViewController.h" 
#import "MySwift-Swift.h" 
#import <UIKit/UIKit.h> 

@implementation MyAppDelegate 

static BOOL USE_SWIFT_VIEW_CONTROLLER = YES; 

- (void)dealloc 
{ 
    [_window release]; 
    [_viewController release]; 
    [super dealloc]; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 
    // Override point for customization after application launch. 

    id viewControllerPtr = nil; 
    if(USE_SWIFT_VIEW_CONTROLLER) 
    { 
     viewControllerPtr = [MyViewControllerSwift alloc]; 
    } 
    else 
    { 
     viewControllerPtr = [MyViewController alloc]; 
    } 

    UIViewController* vController = nil; 
    if(USE_SWIFT_VIEW_CONTROLLER) 
    { 
     vController = [[viewControllerPtr initWithNibName:@"MyViewControllerSwift" bundle:nil] autorelease]; 
    } 
    else 
    { 
     vController = [[viewControllerPtr initWithNibName:@"MyViewController" bundle:nil] autorelease]; 
    } 

    self.viewController = vController; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

ViewController.swift हैं

import Foundation 
import AVFoundation 

@objc class MyViewControllerSwift : UIKit.UIViewController { 

    var player : AVFoundation.AVAudioPlayer?; 

    @IBOutlet weak var myTextView : UITextView!; 

    required init(coder aDecoder : NSCoder) { 
     super.init(coder:aDecoder); 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName:nibNameOrNil, bundle:nibBundleOrNil); 
    } 

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

     println("Using MyViewControllerSwift"); 
    } 

    deinit { 
     //TODO 
    } 
} 

मैं क्या करने की जरूरत है लेना प्रदर्शित करने के लिए मेरा विचार?

धन्यवाद।

(हाँ, यह Loaded nib but the view outlet was not set - new to InterfaceBuilder लिए एक समान प्रश्न है, लेकिन दृश्य आउटलेट दिखाई नहीं देता।)

उत्तर

30
  • पहले - अपने निब फ़ाइल में कस्टम वर्ग सेट (फ़ाइल के मालिक -> तीसरे आइकन -> कस्टम वर्ग: YourViewController)
  • दूसरा -> लिंक (खींचें) "देखें" इंटरफेस दृश्य

करने के लिए अपने ViewController Init तो जैसे संपत्ति - फ़ाइल के मालिक में पिछले आइकन:

YourViewController(nibName: "YourViewName", bundle: nil) 

यह काम करेगा। व्यू के साथ कोई जोड़ नहीं है।

+0

मैंने ऐसा किया है। मैंने दृश्य के सभी जोड़ों को वापस कर दिया है और मेरे कोड में इसका कोई संदर्भ नहीं है। हालांकि, जब मैं "फ़ाइल का मालिक" ऑब्जेक्ट चुनता हूं और कनेक्शन इंस्पेक्टर खोलता हूं, तो वहां कोई "दृश्य" संपत्ति नहीं होती है। http://i.pictr.com/4v475ryo0i.png – cowlinator

+0

इसके अलावा, मुझे यह इंगित करना चाहिए कि मुझे अपने व्यू कंट्रोलर को उद्देश्य-सी का उपयोग करके प्रारंभ करने की आवश्यकता है, न कि तेजी से, इसलिए मैं वास्तव में इसे इस तरह शुरू कर रहा हूं: [[viewControllerPtr initWithNibName: @ "MyViewControllerSwift" बंडल: शून्य] autorelease]; जहां viewControllerPtr एक सही आवंटित आईडी है। – cowlinator

+1

देखो कि आप क्या कर सकते हैं। स्क्रैच से दृश्य बनाएं, इसके साथ कुछ भी न करें। बस फ़ाइल के मालिक पर क्लिक करें, नियंत्रक असाइन करें, और फिर दृश्य खींचें। यह 100% काम करना चाहिए। – user3677173

10

यदि आपने सब कुछ करने की कोशिश की है और आपको अभी भी यह त्रुटि मिलती है, तो वर्ग फ़ाइल को स्क्रैच से फिर से बनाने का प्रयास करें, लेकिन "XIB फ़ाइल भी बनाएं" चेक बॉक्स का चयन करना याद रखें। यह उन फ़ाइलों को स्वतः लिंक करेगा जो इन फ़ाइलों को अलग-अलग बनाते समय लिंक नहीं किए गए हैं। इसके निर्माण के बाद, आप संभवतः नए एक्सआईबी पर सब कुछ काट और पेस्ट कर सकते हैं और इसे ठीक काम करना चाहिए।

मुझे यह समस्या विशेष रूप से स्विफ्ट में फ़ाइलों को अलग-अलग बनाने के साथ मिल रही है।

+0

धन्यवाद, मुझे ऐसी समस्या थी, लेकिन जब इसे xib सब कुछ काम करता है! –

+1

मुझे भी। धन्यवाद, ट्रेविस – Verticon

+0

मुझे भी, मुझे दोनों फाइलों को फिर से बनाने की जरूरत है, अलग फ़ाइल के साथ काम नहीं करते हैं और तेजी से यूवीव लिंक करते हैं। –

1

मुझे एक ही समस्या थी, मेरे दृश्य नियंत्रक पर मेरा दूसरा दृश्य लोड नहीं हो सका। मैंने संपत्ति में दृश्य का नाम बदल दिया (जैसा कि मैंने पहले "व्यू" दिया था)।आपके मौजूदा व्यू कंट्रोलर के पास पहले से ही उसी नाम (व्यू) के दृश्य के संदर्भ थे। इसलिए त्रुटि। आउटलेट नाम बदलने का प्रयास करें। यह मेरे मामले में सही काम किया।

संबंधित मुद्दे

 संबंधित मुद्दे