2013-02-14 15 views
5

मैंने मल्टीव्यू एप्लिकेशन बनाने के लिए एनएसवी व्यूंट्रोलर का उपयोग करने के तरीके को जानने के लिए पहले से ही 2 पूर्ण दिन बिताए हैं।मैक ओएस एक्स कोको मल्टीव्यू एप्लिकेशन नेविगेशन

मैं यही करता हूं।

मेरे पास 2 व्यू कंट्रोलर और MainMenu.xib की विंडो है। मेरे पास एक ऐप कंट्रोलर भी है जो व्यू कंट्रोलर दोनों के लिए प्रतिनिधि है।

जब मैं ऐप लॉन्च करता हूं, तो मुझे सबसे पहले मेनमेनू.एक्सिब के विंडो के दृश्य से बधाई दी जाती है जिसमें एक बटन होता है। इस बटन पर क्लिक करने पर, एक आईबीएक्शन ऐप कंट्रोलर को भेजा जाता है और द्वितीय दृश्य नियंत्रक को इसके निब को प्रदर्शित करने के लिए कहा जाता है। अब तक, सबकुछ ठीक है और निब फ़ाइल सही तरीके से प्रदर्शित होती है।

secondViewController पर, वहाँ एक और बटन appController के लिए एक और IBAction भेजता है और FirstViewController के लिए प्रदर्शित करने के लिए पूछता है, लेकिन कुछ भी नहीं होता है कोई दुर्घटना, कोई चेतावनी है कि है ... किसी भी मदद की बहुत सराहना की जाएगी ... धन्यवाद आपके धैर्य के लिए अग्रिम ... में

यहाँ AppController.h के लिए कोड है:

#import <Foundation/Foundation.h> 
#import "SecondViewController.h" 
#import "FirstViewController.h" 

@interface AppController : NSObject 

@property (strong) IBOutlet NSWindow *mainWindow; 

@property (strong) IBOutlet SecondViewController *secondViewController; 
@property (strong) IBOutlet FirstViewController *firstViewController; 


- (IBAction)secondButtonfromsecondViewControllerClicked:(id)sender; 

- (IBAction)buttonClicked:(id)sender; 

@end 

और यहाँ AppController.m के लिए कोड है:

#import "AppController.h" 


@implementation AppController 
@synthesize mainWindow = mainwindow; 
@synthesize secondViewController; 
@synthesize firstViewController; 

- (IBAction)buttonClicked:(id)sender { 

    NSLog(@"button from second View Controller clicked"); 

    self.secondViewController = [[SecondViewController 
    alloc]initWithNibName:@"SecondViewController" bundle:nil]; 
    self.mainWindow.contentView = self.secondViewController.view; 
    [self.secondViewController.view setAutoresizingMask:NSViewWidthSizable | 
    NSViewHeightSizable]; 
} 

- (IBAction)secondButtonfromsecondViewControllerClicked:(id)sender { 

    NSLog(@"button from first ViewController clicked"); 

    self.firstViewController = [[FirstViewController 
    alloc]initWithNibName:@"FirstViewController" bundle:nil]; 
    self.mainWindow.contentView = [self.firstViewController view]; 

} 


@end 

ठीक है, कोई भी मेरी मदद कर सकता है, मुझे केवल एक दृश्य दृश्य की आवश्यकता है जो पहले व्यू कंट्रोलर पर एक बटन के साथ पहला व्यू कंट्रोलर प्रदर्शित करता है जो मुझे दूसरे बटन के साथ दूसरे दृश्य नियंत्रक में ले जाता है जो मुझे मेरे पहले व्यू कंट्रोलर पर वापस ले जाता है ... मैंने पहले से ही एक हफ्ते से अधिक समय व्यतीत कर लिया है ... व्यर्थ में ... पीएस: मैं mainMenu.xib विंडो और न ही टैब पर कोई बटन नहीं चाहता हूं।

+0

कोई विशेष कारण है कि आप एक व्यू कंट्रोलर का उपयोग करना चाहते हैं (शायद आईओएस में उनका उपयोग करने के लिए इस्तेमाल किया जा रहा है)? यह एक टैब दृश्य के लिए एक आदर्श नौकरी की तरह लगता है। या प्रोग्रामेटिक रूप से विचारों को स्वैप करना भी। – Monolo

+0

ठीक है, और आपने स्पष्ट जांच की है; इंटरफ़ेस बिल्डर के भीतर कार्रवाई कनेक्ट नहीं है? – trojanfoe

+0

Waouh, कम से कम कुछ जवाब ... –

उत्तर

4

यहां मेरे प्रश्न का समाधान है।

यहाँ AppDelegate.h के लिए कोड है:

// AppDelegate.m 

#import "AppDelegate.h" 


@implementation AppDelegate 

@synthesize window = _window; 
@synthesize firstViewController; 
@synthesize secondViewController; 

-(void) awakeFromNib { 

[self goToFirstView]; 
self.firstViewController.delegate = self; 

} 


-(void) goToSecondView { 

     if (self.secondViewController ==nil) { 
      self.secondViewController =[[SecondViewController alloc] 
      initWithNibName:@"SecondViewController" bundle:nil]; 
     } 

     self.window.contentView = [self.secondViewController view]; 
    } 

-(void) goToFirstView { 

if (self.firstViewController ==nil) { 
    self.firstViewController =[[FirstViewController alloc] 
    initWithNibName:@"FirstViewController" bundle:nil]; 
    } 

    self.window.contentView = [self.firstViewController view]; 

} 

@end 

अगला हम FirstViewController और SecondViewController

में प्रतिनिधियों निर्धारित करने की आवश्यकता:

// AppDelegate.h 


#import <Cocoa/Cocoa.h> 
#import "FirstViewController.h" 
#import "SecondViewController.h" 

//We need to declare the AppDelegate class as being the delegate for both 
//FirstViewController and SecondViewController 

@interface AppDelegate : NSObject <NSApplicationDelegate, 
FirstViewControllerDelegate, SecondViewControllerDelegate> 

@property (strong, nonatomic) NSWindow *window; 
@property (strong) FirstViewController *firstViewController; 
@property (strong) SecondViewController *secondViewController; 

-(void) goToSecondView; 
-(void) goToFirstView; 

@end 

अब, यहाँ AppDelegate.m है

// FirstViewController.h 

#import <Cocoa/Cocoa.h> 
#import "SecondViewController.h" 

//We declare the delegation protocole: 

@protocol FirstViewControllerDelegate <NSObject> 

-(void)goToSecondView; 

@end 

@interface FirstViewController : NSViewController 

- (IBAction)firstViewControllerButtonClicked:(id)sender; 

@property (nonatomic, strong) id <FirstViewControllerDelegate> delegate; 

@end 

और यहां FirstViewController.m:

है
// FirstViewController.m 

#import "FirstViewController.h" 

@implementation FirstViewController 
@synthesize delegate; 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

    self.delegate = [NSApp delegate]; 

    } 

    return self; 
} 

- (IBAction)firstViewControllerButtonClicked:(id)sender { 

    NSLog(@"button from first View Controller clicked"); 

    if ([self.delegate respondsToSelector:@selector(goToSecondView)]) { 
    [self.delegate goToSecondView]; 
    } 
} 

@end 

अब, SecondViewController के लिए एक ही बात:

// SecondViewController.h 

#import <Cocoa/Cocoa.h> 

@protocol SecondViewControllerDelegate <NSObject> 

-(void)goToFirstView; 

@end 

@interface SecondViewController : NSViewController 

@property (nonatomic, strong) id <SecondViewControllerDelegate> delegate; 

- (IBAction)goToFirstViewControllerButtonClicked:(id)sender; 

@end 

और यहाँ SecondViewController.m है:

// SecondViewController.m 

    #import "SecondViewController.h" 

    @interface SecondViewController() 

    @end 

    @implementation SecondViewController 

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 

     self.delegate = [NSApp delegate]; 
    } 

    return self; 
    } 

    - (IBAction)goToFirstViewControllerButtonClicked:(id)sender { 

    NSLog(@"button from Second View Controller clicked"); 

    if ([self.delegate respondsToSelector:@selector(goToFirstView)]) { 
    [self.delegate goToFirstView]; 
    } 

} 
@end 

खैर, मैं इस कोड में सुधार किया जा सकता है लगता है और आप किसी भी सुझाव है, तो , मुझे बताने के लिए स्वतंत्र महसूस करें। उम्मीद है कि यह दूसरों की मदद करेगा।

+1

आपका कोड काम नहीं कर रहा है। – zzzzz

0

इस समय यह एक उत्तर नहीं है, हालांकि मुझे आपके कोड के बारे में कुछ चिंताएं हैं जो मैं आपके साथ काम करना चाहता हूं।

  • क्या आप सुनिश्चित हैं कि आपने इंटरफ़ेस बिल्डर में आउटलेट और कार्रवाइयों को कनेक्ट किया है। कृपया इसे सत्यापित करें।

  • आपको mainWindow की आवश्यकता नहीं है क्योंकि पहले से ही window संपत्ति है जो मुख्य विंडो को इंगित करती है (इंटरफ़ेस बिल्डर में इसे सत्यापित करें)। इसके अलावा इस गलत लग रहा है:

    @synthesize mainWindow = mainwindow; 
              ^
              W 
    

    ताकि डंप और सिर्फ Xcode द्वारा प्रदान की मौजूदा window आउटलेट का उपयोग करें।

  • दृश्य नियंत्रकों को फिर से बनाना नहीं है, तो वे पहले से मौजूद:

    if (self.secondViewController == nil) 
    { 
        self.secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" 
                         bundle:nil]; 
    } 
    self.window.contentView = self.secondViewController.view; 
    
+0

कारण मैं व्यू कंट्रोलर का उपयोग करना चाहता हूं यह है कि मैं अपने आईफोन ऐप को मैक पर पोर्ट करना चाहता हूं, और मैं प्रत्येक कार्य के लिए अलग-अलग विचारों का उपयोग करना चाहता हूं। असली सवाल मैं कैसे ViewControllers के बीच नेविगेट और प्रोग्राम के रूप में मेरी viewcontrollers का कोड अंदर से MainMenu.xib की खिड़की के contentView अंदर अपने विचार लोड कर सकते हैं क्या है? आईओएस पर, मैं एक RootViewController और एक नेविगेशन नियंत्रक था, लेकिन वहाँ मैक के लिए कोई नेविगेशन नियंत्रक है ... इसके अलावा, मैं तीन साल में एक ही लाइन से कोड नहीं है तो मैं भी यकीन है कि मुझे पता है कि आईबी के अंदर लिंक करने के लिए नहीं कर रहा हूँ। –

+0

मैं जांचने जा रहा हूं। धन्यवाद ... –

+0

अगर मैं MainWindow संपत्ति AppController वर्ग के भीतर निकालने के लिए, मैं कैसे AppController से mainMenu.xib की खिड़की के contentView कॉल करने के लिए पता नहीं है।मुझे समझ में नहीं आता है "आपको मुख्यविंडो की आवश्यकता नहीं है क्योंकि पहले से ही एक खिड़की की संपत्ति है जो मुख्य विंडो को इंगित करती है"। जब मेरे पास ऐप कंट्रोलर के अंदर मुख्यविंडो प्रॉपर्टी थी, तो मैं इसे पहले व्यू कंट्रोलर को प्रदर्शित करने के लिए उपयोग कर सकता था, अब मैं उस संपत्ति के बिना नुकसान में हूं। क्या मुझे सुपर का उपयोग करना चाहिए? यह समस्या मुख्य विन्डो के साथ प्रतीत होती है जिसका मूल्य 00000 चरण-दर-चरण डीबग मोड में है। –

1

समस्या: उपयोगकर्ता View2 में एक बटन दबाता है, तो आप View1 दिखाना चाहते हैं। यह।

चरण 1: आप कहते हैं कि बटन आपके AppController पर एक क्रिया का आह्वान कर रहा है। उस क्रिया में ब्रेकपॉइंट (या डायग्नोस्टिक लॉग जोड़ें) सेट करें, बस यह सत्यापित करने के लिए कि वास्तव में, इसे लागू किया जा रहा है।

चरण 2: इस बारे में सोचें कि आप क्या करना चाहते हैं, ठीक है। मेरा अनुमान है कि आप व्यू 2 को छुपाना और व्यू 1 दिखाना चाहते हैं। शायद

[view2 setHidden: YES]; 
[view1 setHidden: NO]; 

(मैं, यहाँ अपने नाम का उपयोग कर रहा हूँ नहीं निश्चित रूप से।) या फिर आप संक्रमण चेतन सकता है, या तो विचारों क्रॉस-फ़ेड या उन्हें घूम रहा है।

चरण 3: मेरा अनुमान है कि चरण 2 आपकी समस्या का समाधान करेगा। यदि ऐसा नहीं होता है, तो view1 को सत्यापित करने के लिए फिर से डीबगर का उपयोग करें और व्यू 2 शून्य नहीं हैं। (यदि वे शून्य हैं, तो आपके पास शायद कमजोर चर हैं जहां आपको मजबूत होने की आवश्यकता है।)

चरण 4: संभावित घटना में जो अभी भी अटक गया है, दृश्य 1 और देखें 2 के फ्रेम देखें। शायद देखें 1 वह जगह नहीं है जहां आप सोचते हैं।

चरण 5: यदि आप अभी भी अटक गए हैं, तो देखें1 के अल्फा वैल्यू की जांच करें। हो सकता है कि आप इसे पारदर्शी मानें, और इसे सही जगह पर पारदर्शी रूप से खींचा जा रहा है।

चरण 6: मुझे यकीन है कि कोई चरण 6 नहीं है!

+0

आपके सुझाव के लिए धन्यवाद लेकिन यह वह नहीं है जो मैं करना चाहता था । मुझे उन प्रतिनिधियों का उपयोग करके जो करना चाहता था, उसे लागू करने का एक तरीका मिला है जो Appdelegate को ViewControllers लोड करता है। तथ्य यह है कि मैंने तीन वर्षों में कुछ भी कोड नहीं किया था, इसलिए मुझे इसे लागू करने में कुछ समय लगा। कुछ और पढ़ने के बाद, यह आखिर में काम कर रहा है! वैसे भी आप सभी के लिए धन्यवाद। –

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