0

내 iOS 프로젝트에 매우 이상한 문제가 있습니다. 일부 레이블과 버튼이있는 UIViewController가 있는데 사용자가이 뷰에 들어갈 때 프로그래밍 방식으로 게임 보드를 작성합니다 (지뢰 찾기 게임). 지금 내가하고 싶은 것은 단순한 요소를 추가하는 것입니다 (제 경우에는 분할 된 컨트롤을 사용하지만 버튼을 사용해도 작동하지 않습니다). 보드의 맨 아래 나 시작 부분에 있습니다.Xcode - IB 요소가 런타임시 내보기에 표시되지 않습니다.

인터페이스 빌더에서 뭔가를 추가하면 스토리 보드에서 볼 수 있지만 앱 퍼프를 실행하면 사라집니다! 보기에는 '이전'요소 만 포함되고 새 요소는 표시되지 않습니다. 예 내가 함께 IBOutlet했다 :

@property (weak, nonatomic) IBOutlet UISegmentedControl *clickTypeSegmentedControl; 

을 그리고 네 나는 segemented 컨트롤의 참조를 확인하는 경우 확인. 누군가가 도와 줄 수 있다면 나는 무엇이 잘못되었는지를 정말로 이해할 수 없다. 나는 매우 감사 할 것이다.

** 편집 : ViewController의 코드를 추가했습니다. 게임을 처리하기 때문에 내가 버린 다른 몇 가지 방법이 있습니다. 나는 반복한다 : 아무런 행동도하지 않는 단순한 버튼을 추가하더라도 그것은 보이지 않을 것이다.

#import "GameViewController.h" 
#import "GameBoardModel.h" 
#import "ScoreViewController.h" 
#import <AVFoundation/AVFoundation.h> 

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

@interface GameViewController() 
@property (weak, nonatomic) IBOutlet UILabel *timerLabel; 
@property (weak, nonatomic) IBOutlet UILabel *bombsLabel; 
@property (weak, nonatomic) IBOutlet UIButton *restartButton; 
@property(nonatomic, strong) AVAudioPlayer *soundEffects; 
@property (weak, nonatomic) IBOutlet UISegmentedControl *clickTypeSegmentedControl; 

@end 

@implementation GameViewController 
@synthesize difficulty, timer, playerName, scoreToAdd, clickTypeSegmentedControl; 

double secondsPassed=-1.0f; 
int seconds=0; 
int totalRowsCols=0, totalMines=0, heightWidth=0, clicKNumber=0; 

static NSString * const IMAGE_NAME_FLAG = @"flag.png"; 
static NSString * const IMAGE_NAME_BOMB_X = @"bomb.png"; 


- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    self.navigationItem.hidesBackButton = YES; 
    UIBarButtonItem *backButton =[[UIBarButtonItem alloc]initWithTitle:@"Menù" style:UIBarButtonItemStyleBordered target:self action:@selector(popAlertAction:)]; 
    self.navigationItem.leftBarButtonItem=backButton; 


    clickTypeSegmentedControl.selectedSegmentIndex = 0; 


    rootController = (BombsSeekerViewController *)[self.navigationController.viewControllers objectAtIndex:0]; 


    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults]; 
    playerName = [defaults objectForKey:@"NomeGiocatore"]; 

    scoreToAdd = [[NSMutableDictionary alloc]init]; 

    [self createGameBoard:difficulty]; 
    [self newGame:nil]; 


} 


-(void) newGame:(UIButton *)sender { 
    [self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 
    clicKNumber=0; 
    secondsPassed=0; 
    self.timerLabel.text = [self labelString:secondsPassed]; 

    self.game = [[Game alloc] initWithWidth:totalRowsCols AndHeight:totalRowsCols AndMineCount:totalMines]; 
    self.buttonArray = [[NSMutableArray alloc] init]; 
    [self.restartButton addTarget:self action:@selector(newGame:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:self.restartButton]; 
    [self.view addSubview:self.timerLabel]; 
    [self.view addSubview:self.bombsLabel]; 
    for(int i = 0; i < totalRowsCols; i++) { 
     for (int j = 0; j < totalRowsCols; j++) { 
      self.button = [[Tile alloc] initWithLocation: CGPointMake(j,i) andHW:heightWidth andBlock:self.game.board[j][i] andTag:(i*totalRowsCols+j)]; 
      [self.buttonArray addObject:self.button]; 
      [self.view addSubview:self.button]; 
      [self.button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; 
     } 
    } 

    [self.timer invalidate]; 
} 


- (void) createGameBoard:(int)diff{ 
    switch (diff) { 
     case 1: 
      totalRowsCols = 6; 
      totalMines = 2; 
      heightWidth = 44; 
      break; 
     case 2: 
      totalRowsCols = 8; 
      totalMines = 16; 
      heightWidth = 35; 
      break; 
     case 3: 
      totalRowsCols = 10; 
      totalMines = 25; 
      heightWidth = 29; 
      break; 
    } 
    self.flagCount = totalMines; 
    _bombsLabel.text = [NSString stringWithFormat:@"%d",self.flagCount]; 

} 


-(NSString *) labelString: (int) num { 
    if(num < 10) { 
     return [NSString stringWithFormat:@"00%i",num]; 
    } 
    else if(self.timeCount.intValue < 100) { 
     return [NSString stringWithFormat:@"0%i",num]; 
    } 
    else if(self.timeCount.intValue < 1000) { 
     return [NSString stringWithFormat:@"%i",num]; 
    } 
    else 
     return @"---"; 
} 

-(void) click:(Tile *)sender { 
    if(clicKNumber <1){ 
     [self refreshLabel:self.timer]; 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                selector:@selector(refreshLabel:) 
                userInfo:nil 
                repeats:YES]; 
     clicKNumber++; 

    } 

    if(self.game.gameStatus == STATUS_LOST || self.game.gameStatus == STATUS_WON) return; 
    if (self.clickTypeSegmentedControl.selectedSegmentIndex == 0 && sender.block.marking == MARKING_BLANK) { 
     [self.game clickedAtColumn: sender.point.x AndRow: sender.point.y]; 
     for(Tile *b in self.buttonArray) { 
      if(b.block.marking == MARKING_CLICKED) { 
       b.enabled = NO; 
      } 
      else if(b.block.marking == MARKING_BLANK) { 
       [b setTitle:@"" forState:UIControlStateNormal]; 
       [b setImage:nil forState:UIControlStateNormal]; 
      } 
     } 

    } 
    else if (self.clickTypeSegmentedControl.selectedSegmentIndex == 1){ 
     if(sender.block.marking == MARKING_BLANK && self.flagCount > 0) { 
      sender.block.marking = MARKING_FLAGGED; 
      self.flagCount--; 
      _bombsLabel.text = [NSString stringWithFormat:@"%d",self.flagCount]; 
      [sender setImage:[UIImage imageNamed:IMAGE_NAME_FLAG] forState:UIControlStateNormal]; 
     } 
     else if(sender.block.marking == MARKING_FLAGGED) { 
      sender.block.marking = MARKING_BLANK; 
      self.flagCount++; 
      _bombsLabel.text = [NSString stringWithFormat:@"%d",self.flagCount]; 
      [sender setImage:[UIImage imageNamed:@"tile.png"] forState:UIControlStateNormal]; 
     } 
    } 

    if(self.game.gameStatus == STATUS_LOST) [self gameLost:sender]; 
    else if(self.game.gameStatus == STATUS_WON) [self gameWon]; 

} 
+1

정말 해결책이 필요한 경우 더 많은 코드를 표시해야합니다. – Michael

+0

어떤 코드를 보여야합니까? 코드는 없지만 어제까지 항목을 추가하여 볼 수 있었기 때문에 코드가 있다는 것을 알고 있습니다. 갑자기 오늘은 작동하지 않습니다. 어쩌면 그것은 일부 설정이나 기타 일 수 있지만, 레이블에 첨부 된 페이지의 맨 위에 항목을 삽입해도 이것이 표시되지 않기 때문에 게임 보드와 연결되지 않습니다. –

+0

음, 이상하게도 여전히 ... 코드를 게시하십시오! 스토리 보드 스크린 샷. 어쩌면 당신의 장면이 연결되지 않았거나 뭔가 있습니다. 그냥 우리에게 정보를 줘. – Michael

답변

0

, 당신은이 일을해서는 안 다음 viewDidLoad가 호출 될 때

[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 

가의 newGame 메소드가 호출 될 때, 수퍼에서 알 파단을 제거한다. 스토리 보드에 추가 된 것을 포함합니다.

+0

대단히 감사합니다 !! 그것은 작동합니다! –

+0

문제 없습니다. 게임에 잘 어울립니다! – Michael

0

컨트롤러의 스토리 보드가 올바른 컨트롤러 클래스와 연결되어 있는지 확인하십시오. 이것이 내가 생각하는 것입니다 경우

+0

신원 검사기에서 "클래스"를 의미합니까? 그게 맞습니까? 지금 당장 확인했습니다 –

+0

시나리오를 잘 이해하지 못했지만 스토리 보드에 컨트롤을 추가 한 경우 인터페이스 빌더에서 새 컨트롤이 있는지 확인하십시오 (트리를 보려면 문서 개요를 확인하십시오).). 나는 오래된 컨트롤이 아직 보이고 있다고 생각한다. – Meeshoo

+0

계층 구조 ([UIView removeFromSuperview])에서보기를 제거하는 대신 숨김 속성을 사용하면 임시로 문제가 해결 될 수 있습니다. – Meeshoo

0

당신은로드 후에는 펜촉에 넣어 아무것도 제거지고, 따라서

-(void) newGame:(UIButton *)sender { 
    [self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 
    //... 
} 

-viewDidLoad: 동안이 메서드를 호출합니다.