Как я могу изменить «self.view» в методе кнопки, созданной вне «loadView» - PullRequest
0 голосов
/ 11 марта 2010

Привет, ребята.Поэтому я создаю кнопки динамически в loadView.Каждой из этих кнопок назначается действие с использованием метода @Selector, например:

[кнопка addTarget: self action: @selector (showCCView) forControlEvents: UIControlEventTouchUpInside];

Теперь этот метод showCCViewопределяется за пределами loadView, где находится вышеуказанное утверждение.Суть метода заключается в том, чтобы изменить текущее представление на экране (поэтому установите self.view = ccView).Он выдает мне ошибку каждый раз, когда я пытаюсь получить доступ к self.view вне loadView, и даже иногда, когда я пытаюсь получить к нему доступ в произвольных местах в loadView, он просто ведет себя очень странно.

Я пыталсяизмените это вокруг так, чтобы мне не пришлось иметь дело с этим также.Я сделал функцию + (void) showView: (UIView *) oldView: (UIView *) newView;но это тоже не сработало, потому что @Selector очень любил использовать его с функцией, для которой требовалось два параметра.

Любая помощь, пожалуйста?

Вот мой код:

    //
//  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 Ответ

1 голос
/ 11 марта 2010

Вы пытаетесь использовать один и тот же экземпляр контроллера View для управления несколькими объектами View, что просто не работает. Если вы хотите перейти к отображению другого представления, вы должны отобразить его, используя другой контроллер представления, или добавить новое представление как подпредставление окна как минимум.

...