views:

220

answers:

1

Hey guys. So I am creating buttons dynamically within loadView. Each of these buttons is given an action using the @Selector method, such as :

[button addTarget:self action:@selector(showCCView) forControlEvents:UIControlEventTouchUpInside];

Now that showCCView method is defined outside of loadView, where this above statement is located. The point of the method is to change the view currently on the screen (so set self.view = ccView). It gives me an error every time I try and access self.view outside of loadView, and even sometimes when I try and access it at random places within loadView, it just has been acting really weird.

I tried to change it around so I wouldn't have to deal with this either. I had made a function + (void) showView: (UIView*) oldView: (UIView*) newView; but this didn't work out either because the @Selector was being real prissy about using it with a function that needed two parameters.

Any help please?

Here is my code:

    //
//  SiteOneController.m
//  InstantNavigator
//
//  Created by dni on 2/22/10.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "SiteOneController.h"


@implementation SiteOneController

+ (UIView*) ccContent {

    UIView *ccContent = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

    ccContent.backgroundColor = [UIColor whiteColor];

    [ccContent addSubview:[SiteOneController myNavBar1:@"Constitution Center Content"]];
    return ccContent;
}

// Button Dimensions
int a = 62;
int b = 80;
int c = 200;
int d = 30;

// NPSIN Green Color
+ (UIColor*)myColor1 {  
    return [UIColor colorWithRed:0.0f/255.0f green:76.0f/255.0f blue:29.0f/255.0f alpha:1.0f];
}

// Creates Nav Bar with default Green at top of screen with given String as title
+ (UINavigationBar*)myNavBar1: (NSString*)input {

    UIView *test = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0, 0.0, test.bounds.size.width, 45)];
    navBar.tintColor = [SiteOneController myColor1];

    UINavigationItem *navItem;
    navItem = [UINavigationItem alloc];
    navItem.title = input;
    [navBar pushNavigationItem:navItem animated:false];

    return navBar;
}


//-------------------------------------------------------------------------------------------//
//-------------------------------------------------------------------------------------------//
//-------------------------------------------------------------------------------------------//


 // Implement loadView to create a view hierarchy programmatically, without using a nib.
 - (void)loadView {

     //hard coded array of content for each site

     // CC
     NSMutableArray *allccContent = [[NSMutableArray alloc] init];

     NSString *cc1 = @"House Model";
     NSString *cc2 = @"James Dexter History";

     [allccContent addObject: cc1];
     [cc1 release];

     [allccContent addObject: cc2];
     [cc2 release];

     // FC
     NSMutableArray *allfcContent = [[NSMutableArray alloc] init];

     NSString *fc1 = @"Ghost House";
     NSString *fc2 = @"Franklins Letters";
     NSString *fc3 = @"Franklins Business";

     [allfcContent addObject: fc1];
     [fc1 release];

     [allfcContent addObject: fc2];
     [fc2 release];

     [allfcContent addObject: fc3];
     [fc3 release];

     // PC
     NSMutableArray *allphContent = [[NSMutableArray alloc] init];

     NSString *ph1 = @"Changing Occupancy";
     NSString *ph2 = @"Sketches";
     NSString *ph3 = @"Servant House";
     NSString *ph4 = @"Monument";
     NSString *ph5 = @"Virtual Model";

     [allphContent addObject: ph1];
     [ph1 release];

     [allphContent addObject: ph2];
     [ph2 release];

     [allphContent addObject: ph3];
     [ph3 release];

     [allphContent addObject: ph4];
     [ph4 release];

     [allphContent addObject: ph5];
     [ph5 release];

     // Each content page's view

     //UIView *ccContent = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
     UIView *fcContent = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
     UIView *phContent = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

     //ccContent.backgroundColor = [UIColor whiteColor];
     fcContent.backgroundColor = [UIColor whiteColor];
     phContent.backgroundColor = [UIColor whiteColor];

     //[ccContent addSubview:[SiteOneController myNavBar1:@"Constitution Center Content"]];
     [fcContent addSubview:[SiteOneController myNavBar1:@"Franklin Court Content"]];
     [phContent addSubview:[SiteOneController myNavBar1:@"Presidents House Content"]];   

     //allocate the view
     self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

     //set the view's background color
     self.view.backgroundColor = [UIColor whiteColor];

     [self.view addSubview:[SiteOneController myNavBar1:@"Sites"]];

     NSMutableArray *sites = [[NSMutableArray alloc] init];

     NSString *one = @"Constution Center";
     NSString *two = @"Franklin Court";
     NSString *three = @"Presidents House";

     [sites addObject: one];
     [one release];

     [sites addObject: two];
     [two release];

     [sites addObject: three];
     [three release];

     NSString *ccName = @"Constitution Center";
     NSString *fcName = @"Franklin Court";

     NSString *element;
     int j = 0;
     for (element in sites)
     {
         UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

         //setframe (where on screen)
         //separation is 15px past the width (45-30)
         button.frame = CGRectMake(a, b + (j*45), c, d);

         [button setTitle:element forState:UIControlStateNormal];

         button.backgroundColor = [SiteOneController myColor1];

         /*- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
             NSLog(@"Logs %@ then %@", first, second);
         }
         - (void) performMethodsViaSelectors {
             [self performSelector:@selector(fooNoInputs)];
             [self performSelector:@selector(fooOneInput:) withObject:@"first"];
             [self performSelector;@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];*/

         //UIView *old = self.view;

         if (element == ccName) {
             [button addTarget:self action:@selector(showCCView)
              forControlEvents:UIControlEventTouchUpInside];
          }
          else if (element == fcName) {
          }
          else {
          }

         [self.view addSubview: button];
         j++;
     }

 }

// This method show the content views for each of the sites.
/*+ (void) showCCView {
    self.view = [SiteOneController ccContent];
}*/
+1  A: 

You are attempting to use the same View controller instance to control multiple View objects, which just doesn't work. If you want to transition to display another view, you should display it using another view controller, or add the new view as a subview of the window at the very least.

Ed Marty