【发布时间】:2014-07-08 21:47:43
【问题描述】:
我的 iOS 项目遇到了一个非常奇怪的问题。 我有一个带有一些标签和按钮的 UIViewController,当用户进入这个视图时,我以编程方式构建了一个游戏板(它是扫雷游戏)。 我现在想做的是在板的底部或开头添加一个简单的元素(在我的情况下是分段控件,但我也尝试使用按钮但不起作用)。
当我从 Interface Builder 添加一些东西时,我可以在故事板中看到它,但是当我运行 app puff 时,它就消失了! 视图仅包含“旧”元素,新元素未显示。 是的,我做了一个 IBOutlet:
@property (weak, nonatomic) IBOutlet UISegmentedControl *clickTypeSegmentedControl;
是的,我检查了分段控制的引用是否正常。 我真的不明白哪里出了问题,如果有人可以帮助我将非常感激。
** 编辑:我添加了 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];
}
【问题讨论】:
-
如果你真的需要解决方案,你真的需要展示更多的代码。
-
我应该显示什么代码?我知道没有代码,但这是因为直到昨天我才能将项目添加到我的视图中并看到它们,今天突然这不起作用。所以也许它可能是一些设置或其他,但它与游戏板没有连接,因为即使我将一个项目插入到附加到标签的页面顶部,这也不会显示。
-
嗯,确实很奇怪,仍然...发布您的代码!或者故事板的截图。也许你的场景没有连接或什么的。只要给我们情报。
-
我发布了 ViewController 的代码,可惜我还不能发布图片!
-
请检查我的回答。感谢您提供更多代码。
标签: ios objective-c xcode interface-builder uisegmentedcontrol